外观模式
定义
外观模式(Facade):他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
角色
- 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
- 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
- 客户角色:通过调用Facede来完成要实现的功能。
示例
子系统cpu
public class Cpu {
public void start(){
System.out.println("cpu has started");
}
public void stop(){
System.out.println("cpu has started");
}
}
子系统disk
public class Disk {
public void start(){
System.out.println("disk has started");
}
public void stop(){
System.out.println("disk has started");
}
}
子系统memory
public class Memory {
public void start(){
System.out.println("memory has started");
}
public void stop(){
System.out.println("memory has started");
}
}
电脑外观
public class ComputorFacade {
private Cpu cpu;
private Disk disk;
private Memory memory;
public ComputorFacade() {
this.cpu = new Cpu();
this.disk = new Disk();
this.memory = new Memory();
}
public void start(){
System.out.println("Computor start begin");
cpu.start();
disk.start();
memory.start();
System.out.println("Computor start end");
}
public void stop(){
System.out.println("Computor stop begin");
cpu.stop();
disk.stop();
memory.stop();
System.out.println("Computor stop end");
}
}
测试类
public class FacadeTest {
public static void main(String[] args) {
ComputorFacade computorFacade = new ComputorFacade();
computorFacade.start();
System.out.println("========================");
computorFacade.stop();
}
}
分析
使用场景
- 为复杂的模块或子系统提供外界访问的模块;
- 子系统相互独立;
- 在层析结构中,可以使用外观模式定义系统的每一层的入口。
优点
- 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
- 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
- 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。