系列文章
【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式
文章目录
- 系列文章
- 一、定义
- 二、角色分类
- 三、实现方式
- UML图
- 具体实现
- 四、应用场景
- 五、优缺点
- 优点
- 缺点
一、定义
摘自百度百科: 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
二、角色分类
外观角色(Facade)
也被称为门面角色,是系统对外的统一接口
子系统角色(SubSystem)
子系统可以为多个,其并不知道外观角色的存在
客户角色(Client)
调用方法的角色
三、实现方式
UML图
具体实现
我们在现实中就有相应的例子,假如我们有一个开关板,然后当我们点它的时候就会执行一系列的操作,接下来我们使用代码实现一下
外观角色(Facade)
public class SwitchBoard {private final CircuitA circuitA = new CircuitA();private final CircuitB circuitB = new CircuitB();private final CircuitC circuitC = new CircuitC();public void start() {circuitA.start();circuitB.start();circuitC.start();}
}
CircuitA
子系统角色(SubSystem)
public class CircuitA {public void start() {System.out.println("点开电路A");}
}public class CircuitB {public void start() {System.out.println("打开电路B");}
}public class CircuitC {public void start() {System.out.println("打开电路C");}
}
客户角色(Client)
public class Client {public static void main(String[] args) {SwitchBoard switchBoard = new SwitchBoard();switchBoard.start();}
}
运行结果
打开电路A
打开电路B
打开电路C
四、应用场景
以下部分内容摘自菜鸟教程
意图: 为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用
主要解决: 降低访问复杂系统的内部子系统的复杂度,简化客户端之间的接口
何时使用:
- 客户端不需要知道系统内部的复杂联系,整个系统只需要提供一个“接待员”即可
- 定义系统的入口
如何解决: 客户端不与系统耦合,外观类与系统耦合
关键代码: 在客户端与复杂系统之间再加一层,这一层将调用顺序、依赖关系处理好
应用实例:
- 去医院看病,可能要挂号、门诊、划价、取药等,让患者或其家属觉得很复杂,如果有提供接待人员,只让接待人员处理就会很方便
- Java的三层开发模式
适用场景:
- 为复杂的模块或子系统提供外界访问的模块
- 子系统相对独立
- 预防低水平人员带来的风险
注意事项: 在层次化结构中,可以使用外观模式定义系统中每层的入口
五、优缺点
优点
- 减少系统相互依赖
- 提高灵活性
- 提高安全性
缺点
不符合开闭原则,如果要改东西很麻烦,继承和重写都不合适