1. 概念
Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对象进行。门面对象提供一个高层次的接口,使得子系统更易于使用
如图所示,大方框代表整个系统边界,外面的系统不直接与子系统内的元素打交道,而是通过门面来进行通信。这样的话,隐藏了子系统的实现细节,将调用者与子系统的内部复杂性分隔开
由图可以得知,系统结构中包含两个重要角色:
门面角色:客户端可以调用这个角色的方法。此角色知晓相关的子系统的功能和责任。在正常情况下,本角色将所有从客户端发来的请求委派到相应的子系统中去。
子系统角色:可以同时有一个或多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合
2. 应用场景
1) 为一个复杂子系统提供一个简单接口
子系统往往因为不断深化而变得越来越复杂,使用门面模式可以使得子系统更具可复用性。
2) 子系统的独立性
引入Facade模式将一个子系统与它的客户端以及其他的子系统分离,可以提高子系统的独立性和可移植性
3) 层次化结构
在构建一个层次化的系统时,可以使用Facade模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过Facade进行通信,从而简化了层与层之间的依赖关系3. 示例
大家都知道,计算机的运行需要CPU、内存(Memory)、硬盘的配合, CPU主要负责计算并处理数据,内存负责加载数据、硬盘负责存储及读取数据。对用户而言,如果使用计算机需要他依次打开CPU、内存、硬盘的相应功能,那真是个噩梦。
现在通过Facade模式将CPU、内存等子系统隐藏,呈现给用户的是一台计算机,用户不需要了解其内部实现细节,只要按一个键就可以运行,由计算机自己去管理其子系统(CPU、内存、硬盘)的运行,计算机这个类就可以理解成Facade类,如下图所示:
CPU.java
public class CPU {
public void startProcessData() {
}
}
Memory.java
public class Memory {
public void startLoad() {
}
}
HardDrive.java
public class HardDrive {
public void startReadData() {
}
}
Computer.java
public class Computer {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public Computer() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
public void run() {
cpu.startProcessData();
memory.startLoad();
hardDrive.startReadData();
}
}
Client.java
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer = new Computer();
computer.run();
}
}