概述
- 定义 : 又叫门面模式, 提供了一个统一的接口, 用来访问子系统中的一群接口
- 外观模式定义了一个高层接口, 让子系统更容易使用
- 类型 : 结构型
适用场景
- 子系统越来越复杂, 增加外观模式提供简单调用接口
- 构建多层系统架构, 利用外观对象作为每层的入口, 简化层间调用
优点
- 简化了调用过程, 无需了解深入子系统, 防止带来风险
- 减少了系统依赖, 松散耦合
- 更好的划分访问层次
- 符合迪米特法则, 即最少知道原则
缺点
- 增加子系统, 扩展子系统行为容易引入风险
- 不符合开闭原则
模式角色
-
Facade
- 知道哪些子系统类负责处理请求;
- 将客户的请求代理给适当的子系统对象
-
SubSystem Classes
- 实现子系统的功能。
- 处理由Facade对象指派的任务。
- 没有Facade的任何相关信息;即没有指向Facade的引用。
代码实现
场景: 以看电视为例, 现在网络电视, 需要同时打开电视和电视盒子, 可以把电视和电视盒子分别作为一个子系统, 不使用外观模式的话, 就需要调用电视子系统的打开电视功能和电视盒子子系统的打开电视盒子功能, 如果使用了外观模式之后, 可以将这两步操作封装到外观类之中, 代码如下:
电视子系统类:
/**
* Tv子系统
*
* @author 七夜雪
* @create 2018-11-23 13:59
*/
public class SubTv {
public void openTv(){
System.out.println("打开电视...");
}
}
电视盒子子系统 :
/**
* 电视盒子子系统
*
* @author 七夜雪
* @create 2018-11-23 14:00
*/
public class SubBox {
public void openBox(){
System.out.println("打开电视盒子...");
}
}
外观类 :
/**
* 外观类
*
* @author 七夜雪
* @create 2018-11-23 14:00
*/
public class Facade {
private SubTv subTv = new SubTv();
private SubBox subBox = new SubBox();
public void open(){
subTv.openTv();
subBox.openBox();
}
}
测试代码:
public static void main(String[] args) {
Facade facade = new Facade();
facade.open();
}
运行之后, 可以正确输出, 外观模式比较简单, 也容易理解