文章目录
1. 什么是外观模式?
外观模式是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。
简单来说,外观模式就像是一个"门面",它隐藏了系统的复杂性,并向客户端提供了一个简单的接口。这样,客户端无需了解系统内部的复杂实现,只需与外观对象进行交互即可。
2. 为什么需要外观模式?
在以下情况下,外观模式特别有用:
- 当需要简化复杂系统的接口时:如果一个系统非常复杂,包含许多子系统和组件,外观模式可以提供一个简单的接口,隐藏系统的复杂性
- 当需要将系统与客户端代码解耦时:外观模式可以减少客户端与系统之间的依赖关系
- 当需要将系统分层时:可以使用外观模式定义子系统中每层的入口点
- 当需要为子系统提供一个简单接口时:外观模式可以让子系统更容易使用
3. 外观模式的结构
外观模式通常包含以下角色:
- 外观(Facade):提供了一个统一的接口,用来访问子系统中的一群接口
- 子系统类(Subsystem classes):实现子系统的功能,处理外观对象指派的任务
- 客户端(Client):通过外观接口访问子系统
4. 外观模式的基本实现
4.1 基础示例:计算机启动过程
想象一下启动计算机的过程,它涉及到CPU、内存、硬盘等多个子系统的操作。我们可以使用外观模式来简化这个过程。
首先,定义子系统类:
// CPU子系统
public class CPU {
public void freeze() {
System.out.println("CPU: 冻结...");
}
public void jump(long position) {
System.out.println("CPU: 跳转到位置 " + position);
}
public void execute() {
System.out.println("CPU: 执行指令...");
}
}
// 内存子系统
public class Memory {
public void load(long position, byte[] data) {
System.out.println("内存: 从位置 " + position + " 加载数据");
}
}
// 硬盘子系统
public class HardDrive {
public byte[] read(long lba, int size) {
System.out.println("硬盘: 读取数据,LBA = " + lba + ", 大小 = " + size);
return new byte[size];
}
}
然后,创建外观类:
// 计算机外观类
public class ComputerFacade {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
// 启动地址和启动扇区大小(示例常量)
private static final long BOOT_ADDRESS = 0x00000;
private static final long BOOT_SECTOR = 0x001;
private static final int SECTOR_SIZE = 512;
public ComputerFacade() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
// 提供一个简单的接口来启动计算机
public void start() {
System.out.println("计算机启动开始...");
cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
System.out.println("计算机启动完成!");
}
}
最后,客户端代码:
public class Client {
public static void main(String[] args) {
// 创建计算机外观
ComputerFacade computer = new ComputerFacade();
// 启动计算机,无需知道内部细节
computer.start();
}
}
输出结果:
计算机启动开始...
CPU: 冻结...
硬盘: 读取数据,LBA = 1, 大小 = 512
内存: 从位置 0 加载数据
CPU: 跳转到位置 0
CPU: 执行指令...
计算机启动完成!
在这个例子中,ComputerFacade
类为客户端提供了一个简单的start()
方法,隐藏了启动计算机的复杂过程。客户端无需了解CPU、内存和硬盘之间的交互细节。
5. 更多外观模式示例
5.1 家庭影院系统
一个家庭影院系统通常包含多个组件:投影仪、音响系统、DVD播放器、灯光控制等。我们可以使用外观模式来简化这些组件的操作。
首先,定义子系统类:
// 投影仪
public class Projector {
public void on() {
System.out.println("投影仪:打开");
}
public void off() {
System.out.println("投影仪:关闭");
}
public void setInput(String input) {
System.out.println("投影仪:设置输入为 " + input);
}
public void setMode(String mode) {
System.out.println("投影仪:设置模式为 " + mode);
}
}
// 音响系统
public class AudioSystem {
public void on