外观模式
什么是外观模式:
外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口。
使用外观模式有以下几点好处:
(1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了;
(2)松散耦合:将客户端与子系统解耦,让子系统内部的模块能更容易扩展和维护。
(3)更好的划分访问层次:通过合理使用 Facade,可以更好地划分访问的层次,有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性,所以外观模式适用于为复杂子系统提供一个简单接口,提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦,提高子系统的独立性和可移植性。
UML结构图:
代码实现
我们以一个计算机的启动过程为例:
public class CPU {
public void startup(){
System.out.println("cpu startup!");
}
public void shutdown(){
System.out.println("cpu shutdown!");
}
}
public class Memory {
public void startup(){
System.out.println("memory startup!");
}
public void shutdown(){
System.out.println("memory shutdown!");
}
}
public class Disk {
public void startup(){
System.out.println("disk startup!");
}
public void shutdown(){
System.out.println("disk shutdown!");
}
}
//Facade类
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void startup(){
System.out.println("start the computer!");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("start computer finished!");
}
public void shutdown(){
System.out.println("begin to close the computer!");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("computer closed!");
}
}
Main类如下:
public class Main{
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
computer.shutdown();
}
}
运行结果:
start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!
Facade类其实相当于CPU、Disk、Memory模块的外观界面,有了这个Facade类,那么客户端就不需要亲自调用子系统中的CPU、Disk、
Memory模块了,也不需要知道系统内部的实现细节,甚至都不需要知道CPU、Disk、Memory模块的存在,客户端只需要跟Facade类交互就好了,
从而更好地实现了客户端和子系统中CPU、Disk、Memory模块的解耦,让客户端更容易地使用系统。