外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式定义了一个高层接口,使子系统更容易使用。
以下是一个使用 Java 实现外观模式的实践案例:
场景描述
假设我们有一个复杂的计算机系统,它包含多个组件,如 CPU、内存和硬盘。我们希望提供一个简化的接口来启动和关闭整个计算机。
步骤1:创建复杂子系统的组件
1// CPU 类
2class CPU {
3 public void freeze() {
4 System.out.println("CPU freeze.");
5 }
6 public void jump(long position) {
7 System.out.println("CPU jump to position " + position);
8 }
9 public void execute() {
10 System.out.println("CPU execute.");
11 }
12}
13
14// 内存类
15class Memory {
16 public void load(long position, byte[] data) {
17 System.out.println("Memory load from position " + position);
18 }
19}
20
21// 硬盘类
22class HardDrive {
23 public byte[] read(long lba, int size) {
24 System.out.println("Hard drive read lba " + lba + " size " + size);
25 return new byte[]{}; // 返回假数据
26 }
27}
步骤2:创建外观类
1// 计算机类,作为外观类提供简化接口
2class ComputerFacade {
3 private CPU cpu;
4 private Memory memory;
5 private HardDrive hardDrive;
6
7 public ComputerFacade() {
8 this.cpu = new CPU();
9 this.memory = new Memory();
10 this.hardDrive = new HardDrive();
11 }
12
13 public void start() {
14 cpu.freeze();
15 memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
16 cpu.jump(BOOT_ADDRESS);
17 cpu.execute();
18 }
19
20 // 可以添加更多方法,如 shutdown 方法等
21
22 private static final long BOOT_ADDRESS = 0x0000fff0L;
23 private static final long BOOT_SECTOR = 0x00007C00L;
24 private static final int SECTOR_SIZE = 512;
25}
步骤3:客户端代码使用外观类
1public class FacadePatternDemo {
2 public static void main(String[] args) {
3 ComputerFacade computer = new ComputerFacade();
4 computer.start(); // 客户端代码只需要调用外观类的 start 方法
5 }
6}
在上述代码中,CPU、Memory 和 HardDrive 类代表了计算机的主要组件,每个类都有各自的复杂接口。ComputerFacade 类作为外观,提供了 start() 方法,该方法封装了启动计算机所需的步骤。
客户端代码只需要知道 ComputerFacade 类,并调用其 start() 方法来启动计算机,无需了解内部的复杂逻辑。这样使客户端代码从复杂的子系统中解耦,简化了操作和维护。
外观模式常用于为复杂的系统提供一个简单的接口,或者当需要为子系统中的一组接口提供一个清晰而简单的界面时。它还有助于分层系统,并且可以作为系统各层间的通信的中介。