外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
比如下面这种图
用户如果想调用模块A,模块B,模块C,本身不需要了解这三个模块,只需调用facade,让其去执行。那么Facade就是这几个模块的门面,即外观模式。
外观模式
以电脑开机关机为例
用户开机时不会依次点cpu开机,内存开机,而是通过电源键进行开机关机。电源键就是这些部件的门面。
创建启动和关闭的接口
public interface Action {
void start();
void shutDown();
}
下面让CPU, Memory,Disk继承这个接口
CPU
public class CPU implements Action {
@Override
public void start() {
System.out.println("cup start");
}
@Override
public void shutDown() {
System.out.println("cup shutDown");
}
}
磁盘
public class Disk implements Action {
@Override
public void start() {
System.out.println("disk start");
}
@Override
public void shutDown() {
System.out.println("disk end");
}
}
内存
public class Memory implements Action {
@Override
public void start() {
System.out.println("memory start");
}
@Override
public void shutDown() {
System.out.println("memory end");
}
}
下面创建门面类Facade
public class Facade {
private CPU cpu;
private Disk disk;
private Memory memory;
public Facade(){
this.cpu = new CPU();
this.disk = new Disk();
this.memory = new Memory();
}
public void start(){
cpu.start();
disk.start();
memory.start();
}
public void shutDown(){
cpu.shutDown();
disk.shutDown();
memory.shutDown();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.start();
facade.shutDown();
}
}
结果是:
cup start
disk start
memory start
cup shutDown
disk end
memory end
优点
1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。