1. [门面模式/外观模式] 是 [对象的适配器模式] 的衍生模式
2.[门面模式/外观模式] 简介
外观模式是隐藏了系统的复杂性,能够为子系统中的一组接口提供一个统一的接口。客户在使用系统时不必和子系统打交道了,降低了客户和子系统间的耦合。
简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只关心结果即可。这个场景其实在日常开发中使用的频率还是非常高的;
3.案例分析
假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。关闭也是如此。但是实际上我们在电脑开/关机时根本不需要去操作这些组件,因为电脑已经帮我们都处理好了,并隐藏了这些东西。这些组件好比子系统角色,而电脑就是一个外观角色。代码如下:
CPU:
public class A1_CPU {
public void startUp(){
System.out.println("CPU 已经启动就绪");
}
public void shutDown(){
System.out.println("CPU 已经停止运行");
}
}
内存:
public class A2_Memory {
public void startUp(){
System.out.println("内存 已经启动就绪");
}
public void shutDown(){
System.out.println("内存 已经停止运行");
}
}
硬盘:
public class A3_Disk {
public void startUp(){
System.out.println("硬盘 已经启动就绪");
}
public void shutDown(){
System.out.println("硬盘 已经停止运行");
}
}
门面-电脑:
public class B1_Computer {
private A1_CPU cpu;
private A2_Memory memory;
private A3_Disk disk;
public B1_Computer(){
this.cpu = new A1_CPU();
this.memory = new A2_Memory();
this.disk = new A3_Disk();
}
public void startUp(){
this.cpu.startUp();
this.memory.startUp();
this.disk.startUp();
System.out.println("....电脑启动....");
}
public void shutDown(){
this.cpu.shutDown();
this.memory.shutDown();
this.disk.shutDown();
System.out.println("....电脑停止....");
}
}
客户端调用:
public class C1_Client {
public static void main(String[] args) {
B1_Computer computer = new B1_Computer();
computer.startUp();
System.out.println("==============");
computer.shutDown();
}
}
客户端调用结果:
CUP 已经启动就绪
内存 已经启动就绪
硬盘 已经启动就绪
....电脑启动....
==============
CUP 已经停止运行
内存 已经停止运行
硬盘 已经停止运行
....电脑停止....
4.外观模式的角色
- 门面角色(facade):这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
- 子系统角色(SystemA、SystemB、SystemC):实现了子系统的功能。对子系统角色来说,facade角色与客户角色一样,是未知的,它没有任何facade角色的信息和链接。
- 客户角色(client):调用facade角色来完成要得到的功能。
5.外观模式的优点
- 对客户端屏蔽了子系统组件,减少了客户端处理的对象数量,也减少了客户端的代码量。
- 实现了客户端和子系统的松散耦合,使得子系统个变化不会影响到调用它的客户端,只需要改变外观类即可。
- 一个子系统的变化不会影响到另一个子系统,子系统内部变化也不会影响到外观对象。
6.外观模式的缺点
- 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。