- 一、导语
- 二、怎么用
1.样例背景
2.UML类图
3.代码示例- 三、优缺点
- 四、使用场景
1.概括描述
2.现存知名产品中的使用示例- 五、与其他设计模式的对比
- 六、参考
一、导语
外观模式(Facade),也叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口。
它定义了一个高层接口,让子系统更容易使用。
外观模式是迪米特法则非常好的典型的例子。
降低了应用层(client),与子系统之间的耦合度。
二、怎么用
共有2个示例,代码详见访问链接
下面以example2举例说明
1. 样例背景
以一个计算机的启动过程为例
子系统:CPU,Memory,Disk
门面:计算机
2. UML类图
Disk -------------------- 硬盘子系统
Memory ---------------- 内存子系统
CPU -------------------- CPU子系统
Computer -------------- 门面类
3. 代码示例
/**
* description: 子系统:硬盘
*/
public class Disk {
public void startup() {
System.out.println("disk startup!");
}
public void shutdown() {
System.out.println("disk shutdown!");
}
}
/**
* description: 子系统:内存
*/
public class Memory {
public void startup() {
System.out.println("memory startup!");
}
public void shutdown() {
System.out.println("memory shutdown!");
}
}
/**
* description: 子系统:CPU
*/
public class CPU {
public void startup() {
System.out.println("cpu startup!");
}
public void shutdown() {
System.out.println("cpu shutdown!");
}
}
/**
* description: 门面类: 计算机
*/
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer() {
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void startup() {
System.out.println("start the computer!");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("start computer finished!");
}
public void shutdown() {
System.out.println("begin to close the computer!");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("computer closed!");
}
}
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
computer.shutdown();
}
}
执行结果
start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!
三、优缺点
缺点
1.增加子系统、扩展子系统行为容易引入风险
2.不符合开闭原则优点
1.简化了调用过程,无需深入了解子系统,防止带来风险
2.减少系统依赖、松散耦合
3.更好的划分访问层次
4.符合迪米特法则,即最少知道原则
四、使用场景
1. 概括描述
- 子系统越来越复杂,增加外观模式提供简单调用的接口
- 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
2. 现存知名产品中的使用示例 todo
2.1 org.springframework.jdbc.support.JdbcUtils (spring)
2.2 org.apache.ibatis.session (mybatis)
2.3 RequestFacade(tomcat)
五、相关设计模式
1. 外观模式和中介者模式
外观模式关注的是外界和子系统之间的交互
中介者模式关注的是子系统之间的交互
2. 外观模式和单例模式
通常我们可以把外观模式中的外观对象,做成单例模式的,把他们结合起来使用。
3. 外观模式和抽象工厂模式
外观类可以通过抽象工厂获取子系统的实例,
这样呢,子系统可以将内部对外观类进行屏蔽。
这个也是这几模式结合使用的一种方式。