
一、介绍
外观模式(Facade Pattern),又称为门面模式,属于结构型设计模式。外观模式为一组子系统的逻辑调用提供一个独立的接口调用。
在不使用外观模式的情况下,实现一个功能时需要按照一定的顺序对多个方法调用,因此我们需要关注对哪些方法进行调用,以及按照什么样的顺序。
而在外观模式中,我们通过调用外观类(Facade)的一个方法就可以实现该功能,该外观类(Facade)内部按照对应的顺序对这些方法进行调用,而具体按照什么样的顺序调用哪些方法我们无需关注,交给外观类(Facade)就可以了。
外观模式可以隐藏某个功能的内部逻辑细节,而提供给我们最简单的方式实现该功能。
二、外观模式中的角色
在外观模式中,包含以下三个角色:
- 子系统(System)
功能的实际提供者,多个子系统共同实现一个功能。
- 外观类(Facade)
将多个子系统的功能进行整合,并向客户端提供实现整合后功能的唯一接口。用于隐藏功能的内部细节。
- 调用方(Client)
外观类的调用方,只需要关注外观类提供的功能,无需关注内部细节。

三、案例
外观类
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 start() {
System.out.println("启动计算机...");
cpu.processData();
memory.load();
hardDrive.readData();
System.out.println("计算机启动完毕!");
}
public void shutDown() {
System.out.println("关闭计算机...");
hardDrive.quit();
memory.quit();
cpu.quit();
System.out.println("计算机关闭完毕!");
}
}
子系统A
java
public class CPU {
public void processData() {
System.out.println("正在处理数据...");
}
public void quit() {
System.out.println("正在关闭CPU...");
}
}
子系统B
java
public class HardDrive {
public void readData() {
System.out.println("正在读取硬盘数据...");
}
public void quit() {
System.out.println("正在退出硬盘...");
}
}
子系统C
java
public class Memory {
public void load() {
System.out.println("正在加载内存...");
}
public void quit() {
System.out.println("正在退出内存...");
}
}
测试

四、优缺点
优点:
- 隐藏了功能细节,关注功能本身
- 对客户端友好
- 功能内聚
缺点:
- 引入了多余的外观类。因为没有外观类,同样可以实现一样的结果