外观模式
外观模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。
定义
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口使得这一个子系统更加容易使用。
使用场景
当你要为一个复杂子系统提供一个简单的接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具有可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过facade层。
客户程序与抽象类的实现部分之间存在很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
- 当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
结构
实现
public class CPU {
public void startup(){
System.out.println("CPU is startup");
}
public void shutdown(){
System.out.println("CPU is shutdown");
}
}
public class Disk {
public void startup(){
System.out.println("Disk is startup");
}
public void shutdown(){
System.out.println("Disk is shutdown");
}
}
public class Display {
public void startup(){
System.out.println("Display is startup");
}
public void shutdown(){
System.out.println("Display is shutdown");
}
}
public class Computer {
private CPU cpu;
private Disk disk;
private Display display;
public Computer(){
cpu = new CPU();
disk = new Disk();
display = new Display();
}
public void startup(){
System.out.println("Computer is starting");
cpu.startup();
disk.startup();
display.startup();
System.out.println("Computer has started");
}
public void shutdown(){
System.out.println("Computer will shutdown");
display.shutdown();
disk.shutdown();
cpu.shutdown();
System.out.println("Computer has shutdown");
}
}
测试
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
System.out.println("");
computer.shutdown();
}
}
运行结果:
CPU is startup
Disk is startup
Display is startup
Computer has started
Computer will shutdown
Display is shutdown
Disk is shutdown
CPU is shutdown
Computer has shutdown
如果没有上面的Computer类,那么各个类之间的依赖关系就变得很复杂,所以外观模式能够降低客户与子系统之间的耦合度。