结构型设计模式 - 外观模式详解
基本介绍
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,它为子系统中的一组接口提供一个统一的高层接口,使子系统更容易被使用。
外观模式又称为门面模式,它是一种对象结构型模式。
模式结构
1、Client(客户端):调用者
2、Facade(外观类):即上述所讲的高层接口
3、SubSystem(子系统):被调用者
举例说明
想要使用电脑,你只需要按一下开机键(客户端),电脑的各个部件(子系统)就开始工作了,你不需要关心硬盘如何启动的,CPU怎么运转的等等,一切都交给内部程序(外观类)处理。
编写简单的程序模拟一下
「SubSystem」:电脑的几个部件 CPU、内存、硬盘
public class Cpu {
//使用「单例模式--饿汉式」创建对象
private static Cpu instance = new Cpu();
private Cpu() {
}
public static Cpu getInstance() {
return instance;
}
public void start() {
System.out.println("CPU启动");
}
public void stop() {
System.out.println("CPU停止工作");
}
}
public class Memory {
private static Memory instance = new Memory();
private Memory() {
}
public static Memory getInstance() {
return instance;
}
public void start() {
System.out.println("内存启动");
}
public void stop() {
System.out.println("内存停止工作");
}
}
public class HardDisk {
private static HardDisk instance = new HardDisk();
private HardDisk() {
}
public static HardDisk getInstance() {
return instance;
}
public void start() {
System.out.println("硬盘启动");
}
public void stop() {
System.out.println("硬盘停止工作");
}
}
「Facade」:电脑,统一管理开机关机中硬件的启动与停止
public class Computer {
private Cpu cpu;
private Memory memory;
private HardDisk hardDisk;
public Computer() {
this.cpu = Cpu.getInstance();
this.memory = Memory.getInstance();
this.hardDisk = HardDisk.getInstance();
}
/**
* 开机
*/
public void boot(){
cpu.start();
memory.start();
hardDisk.start();
}
/**
* 关机
*/
public void shutdown(){
cpu.stop();
memory.stop();
hardDisk.stop();
}
}
「Client」:电源键,可控制开机、关机
public class Client {
Computer computer = new Computer();
@Test
public void boot(){
computer.boot();
}
@Test
public void shutdown(){
computer.shutdown();
}
}
模式分析
优点:
- 实现了客户端与子系统的低耦合,使得子系统的变化不会影响客户端,只需要调整外观类即可。
- 对客户端屏蔽子系统,减少了客户端处理的对象数目,操作变得更简单。
- 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
缺点:
- 不能很好的限制客户端对子系统的使用,如果对其做了太多限制会降低可变性和灵活性。
- 在不引入「抽象外观类」的情况下,如果增加新的子系统,需要修改外观类代码,违背了「开闭原则」。
适用场景
- 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
- 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
p.s. 所有代码和笔记均可在 我的GitHub 中获取,如果对您有帮助的话,可以点个 star 支持一下 🙈