设计模式之外观模式(结构型)--- 11
2019-08-03 本文已影响0人
auzqy
- 一、导语
- 二、怎么用
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. 外观模式和抽象工厂模式
外观类可以通过抽象工厂获取子系统的实例,
这样呢,子系统可以将内部对外观类进行屏蔽。
这个也是这几模式结合使用的一种方式。