外观模式(Facade)
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。(摘自菜鸟教程)。这种模式代码实现起来很简单,我们就来举一个电脑启动和关闭的例子吧。我们在启动电脑的时候,只需要按一个按钮,但是电脑本身却是干了很多事情,例如它会启动CPU,启动内存,启动硬盘等。反映到代码中就是下面这样:
首先我们来声明CPU,内存,硬盘类:
package com.lc.clz.pattern.construct.facade;
/**
* @author chenglezheng
* @date 2020-01-22 10:10
*/
public class CPU {
public void startCPU(){
System.out.println("start CPU");
}
public void endCPU(){
System.out.println("end CPU");
}
}
package com.lc.clz.pattern.construct.facade;
/**
* @author chenglezheng
* @date 2020-01-22 10:15
*/
public class Disk {
public void startDisk(){
System.out.println("start Disk");
}
public void endDisk(){
System.out.println("end Disk");
}
}
package com.lc.clz.pattern.construct.facade;
/**
* @author chenglezheng
* @date 2020-01-22 10:13
*/
public class Memory {
public void startMemory(){
System.out.println("start Memory");
}
public void endMemory(){
System.out.println("end Memory");
}
}
接着我们来写电脑类了,
package com.lc.clz.pattern.construct.facade;
/**
* @author chenglezheng
* @date 2020-01-22 10:16
*/
public class Computer {
CPU cpu=new CPU();
Memory memory=new Memory();
Disk disk=new Disk();
/**
* 开电脑
*/
public void startComputer(){
cpu.startCPU();
memory.startMemory();
disk.startDisk();
}
/**
* 关电脑
*/
public void endComputer(){
cpu.endCPU();
memory.endMemory();
disk.endDisk();
}
}
至此,外观模式就写完了,是不是很so easy。接着来测试下:
/**
* 外观模式测试
*/
@Test
public void FacadeTest(){
Computer computer=new Computer();
computer.startComputer(); //开电脑
computer.endComputer(); //关电脑
}
输出结果:
start CPU
start Memory
start Disk
end CPU
end Memory
end Disk
从结果可以看出,我们在启动电脑和关电脑的时候,是不是就很简单了,不需要那么复杂的步骤了,电脑本身都给我们解决了,我们只需要调用电脑类提供出来的一个方法就行。
总结:
优点:
1.避免了系统之间的相互依赖。
2.无论系统内部怎样运行,只要没有影响到外观对象,随你怎么high,因此提高了调用的灵活性。
3.想让你看到的东西,不想让你看到的东西,都可以通过外观对象自由控制,这样也因此提供了系统的安全性。
缺点
1.不符合设计模式的基本原则,修改起来需要维护已有的类。
使用场景
1.为一个复杂的模块或子系统提供对外访问的简单接口;
2.子系统相对整个系统比较独立,指向进行简单的黑箱操作即可。