概念
外观设计模式也称作facade模式,用来给子系统的一组接口提供统一接口,作为一种结构型模式,主要解决客户端和组件中的子系统有过多的耦合问题。外观模式对子系统提供了一个更高层次,更简单的接口,从而降低了子系统的复杂度和依赖,外观对象隔离了子系统和客户端,从而降低了耦合。
模式结构
外观模式角色结构
- 门面角色(facade):外观模式的核心,被客户调用,熟悉子系统的功能;
- 子系统角色:实现子系统的功能,对facade角色未知;
- 客户角色:调用facade角色完成需要的功能。
示例说明
/** * 门面角色 */ public class Computer { private CPU cpu; private Disk disk; private Memory memory; public Computer() { this.cpu = new CPU(); this.disk = new Disk(); this.memory = new Memory(); } public void startup(){ System.out.println("启动电脑开始"); cpu.startup(); memory.startup(); disk.startup(); System.out.println("启动电脑完成"); } public void shutdown(){ System.out.println("关闭电脑开始"); cpu.shutdown(); memory.shutdown(); disk.shutdown(); System.out.println("关闭电脑完成"); } } /** * 子系统角色1 */ class CPU{ public void startup(){ System.out.println("启动CPU"); } public void shutdown(){ System.out.println("关闭CPU"); } } /** * 子系统角色2 */ class Memory{ public void startup(){ System.out.println("加载内存"); } public void shutdown(){ System.out.println("清空内存"); } } /** * 子系统角色3 */ class Disk{ public void startup(){ System.out.println("加载硬盘"); } public void shutdown(){ System.out.println("卸载硬盘"); } } /** * 客户 */ class ComputerClient{ public static void main(String[] args){ Computer computer = new Computer(); computer.startup(); System.out.println("==================================="); computer.shutdown(); } }运行结果:
启动电脑开始
启动CPU
加载内存
加载硬盘
启动电脑完成
===================================
关闭电脑开始
关闭CPU
清空内存
卸载硬盘
关闭电脑完成
通过Computer一个外观类实现计算机所有部件的控制,客户端只调用外观类,实现了客户端与子系统的解耦。
外观模式的优缺点
- 对客户屏蔽了子系统组件,使客户使用子系统更加方便;
- 实现了子系统与客户之间的松散耦合关系;
- 如果需要也不限制使用子系统类
疑问:这个模式有点类似于网关,那么如果门面角色类一旦挂掉了,不是会影响到所有的子系统的调用么???