定义
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
从定义就可以清楚的知道,外观模式就是为一个子系统定制一个外观接口,供客户端调用,这样屏蔽了子系统的复杂性,客户端可以很容易的使用子系统的功能。
外观模式的角色
外观模式的角色包括子系统角色SubSystem和外观角色Facade。
SubSystem: 表示一个系统的子系统或模块。
Facade: 客户端通过操作外观角色从而达到控制子系统角色的目的,其隔绝了客户端与子系统直接接触的风险。
下面通过代码了解外观模式。
笔记本开机时,内存、CPU、磁盘等等必须按一定的顺序启动,事实上我们只需要按下开机键即可完成一系列子部件的启动,开机键即为外观角色Facade,一系列子部件即为子系统角色SubSystem。
首先创建一个接口
public interface Computer {
void open();
}
创建其实现类
class Ddr implements Computer {
@Override
public void open() {
System.out.println("启动内存");
}
}
-------------------------------
class Cpu implements Computer {
@Override
public void open() {
System.out.println("启动CPU");
}
}
-------------------------------
class Ssd implements Computer {
@Override
public void open() {
System.out.println("启动硬盘");
}
}
创建Facade外观类
public class Facade {
private Computer cpu;
private Computer ddr;
private Computer ssd;
public Facade(){
cpu = new Cpu();
ddr = new Ddr();
ssd = new Ssd();
}
//客户端调用这个方法即可
public void openComputer(){
cpu.open();
ddr.open();
ssd.open();
System.out.println("启动电脑");
}
}
测试
public class Test{
public static void main(String[] args) {
Facade facade = new Facade();
facade.openComputer();
}
}
总结
1.设计原则
外观模式体现了迪米特原则LOD,即类应该与其协作类进行交互但无需了解它们的内部结构。 ps:不符合开闭原则
2.优点
1、减少系统相互依赖,客户端与系统解耦
2、提高灵活性
3、安全
3.使用场景
1、为一个复杂的模块或子系统提供一个供外界访问的接口
2、子系统相对独立——外界对子系统的访问只要黑箱操作即可
3、预防低水平人员带来的风险扩散