设计模式-外观模式(Facade)
外观模式又称为门面模式,为一组类似功能的集群,比如类库、子系统等,提供一致的入口供client调用
角色和职责:
1.门面(Facade)-Computer:
外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合
2.子系统(Packages)=CPU、Memory、Disk:
实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口
UML图:
具体源码:
/** * CPU */ public class CPU { /** * 启动CPU */ public void startCpu(){ System.out.println("启动CPU"); } /** * 关闭CPU */ public void shutdownCpu(){ System.out.println("关闭CPU"); } }
/** * 内存条 */ public class Memory { public void startMemory(){ System.out.println("启动内存"); } public void shutdownMemory(){ System.out.println("关闭内存"); } }
/** * 桌面 */ public class Disk { public void startDisk(){ System.out.println("启动桌面"); } public void shutdownDisk(){ System.out.println("关闭桌面"); } }
/** * 电脑 */ public class Computer { private CPU cpu = null; private Memory memory = null; private Disk disk = null; public Computer(){ this.cpu = new CPU(); this.memory = new Memory(); this.disk = new Disk(); } /** * 启动电脑 */ public void start(){ this.cpu.startCpu(); this.memory.startMemory(); this.disk.startDisk(); } /** * 关闭电脑 */ public void shutdown(){ this.cpu.shutdownCpu(); this.memory.shutdownMemory(); this.disk.shutdownDisk(); } }
public class Main { public static void main(String[] args) { Computer computer = new Computer(); computer.start();//启动电脑 System.out.println("------------------------------------------"); computer.shutdown();//关闭电脑 } }
优缺点:
优:
- 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
- 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
- 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节
应用场景:
为复杂的模块或子系统提供外界访问的模块
子系统相互独立
在层析结构中,可以使用外观模式定义系统的每一层的入口。
源码地址:https://github.com/qjm201000/design_pattern_facade.git