门面模式
也叫外观(Facade)模式,外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
客户端不与系统耦合,外观类与系统耦合
实现细节
Shape:系统角色,定义子系统的功能
ConcreteShape:具体功能类
Facade:门面角色,客户端可以调用这个角色,此角色知晓子系统的所有功能和责任。此橘色会将所有从客户端发来的请求委派到相应的子系统去,它只是一个委托类。
使用场景
- 为一个复杂子系统提供一个简单接口
- 提高子系统的独立性
- 在层次化结构中,可以使用Facade模式定义系统中每一层的入口
- slf4j框架使用了门面模式,即把自己作为一个日志接口,并不提供实现。
优点
- 减少系统的相互依赖,所有的依赖都是对门面对象的依赖,与子系统无关
- 提高了灵活性 依赖减少了,灵活性自然提高了,子系统内部的变化,只要不影响门面对象,高层就不用变化
- 提高安全性 想让你访问子系统的哪些业务就开通哪些逻辑,不在门面对象上开通的方法,不能访问到
缺点
- 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适
案例
电脑整机是 CPU、内存、硬盘的外观。有了外观以后,启动电脑和关闭电脑都简化了。
直接 new 一个电脑。在 new 电脑的同时把 cpu、内存、硬盘都初始化好并且接好线。
对外暴露方法(启动电脑,关闭电脑)。
启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU
- 定义子系统computer的open功能
public interface Computer {
void open();
}
- 具体的子系统角色
class Cpu implements Computer {
public void open() {
System.out.println("CPU OPEN");
}
}
class Ddr implements Computer {
public void open() {
System.out.println("DDR OPEN");
}
}
class Ssd implements Computer {
public void open() {
System.out.println("SSD OPEN");
}
}
- 门面角色,封装系统的功能
public class Facade {
private Cpu cpu;
private Ddr ddr;
private Ssd ssd;
public Facade() {
cpu = new Cpu();
ddr = new Ddr();
ssd = new Ssd();
}
public void onCpu() {
cpu.open();
}
public void onDdr() {
ddr.open();
}
public void onSsd() {
ssd.open();
}
}
- 具体使用
public class Demo {
public static void main(String[] args) {
Facade facade = new Facade();
facade.onCpu();
facade.onDdr();
facade.onSsd();
}
}
其实说白了就是通过一个门面类将子系统的功能封装,避免外界使用子系统的方法。