外观模式是一种结构型设计模式,旨在提供一个统一的接口,以简化系统中多个子系统之间的交互和使用。它通过提供一个高层次的接口,隐藏了系统复杂性,让客户端可以更容易地使用系统。
结构
外观模式有以下关键角色:
- Facade(外观):提供了一个简化的接口,隐藏了系统中复杂的子系统,并将客户端请求委派给适当的子系统处理。
- Subsystems(子系统):实现了系统的各种功能,但是被外观所包装,客户端可以通过外观接口间接地访问这些功能。
代码示例
以下是一个简单的 Java 示例,展示了外观模式在计算机启动过程中的应用:
// Subsystem classes
class CPU {
public void start() {
System.out.println("CPU is starting...");
}
public void shutdown() {
System.out.println("CPU is shutting down...");
}
}
class Memory {
public void load() {
System.out.println("Memory is loading...");
}
public void free() {
System.out.println("Memory is freed...");
}
}
class HardDrive {
public void read() {
System.out.println("Hard Drive is reading...");
}
public void write() {
System.out.println("Hard Drive is writing...");
}
}
// Facade
class ComputerFacade {
private final CPU cpu;
private final Memory memory;
private final HardDrive hardDrive;
public ComputerFacade() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
public void startComputer() {
cpu.start();
memory.load();
hardDrive.read();
System.out.println("Computer is started.");
}
public void shutdownComputer() {
cpu.shutdown();
memory.free();
hardDrive.write();
System.out.println("Computer is shut down.");
}
}
public class Main {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.startComputer();
System.out.println("Working on the computer...");
computer.shutdownComputer();
}
}
在这个示例中,CPU、Memory和HardDrive分别代表了计算机的不同子系统,而ComputerFacade是外观类,它提供了startComputer和shutdownComputer两个方法,隐藏了系统启动和关闭的复杂过程。在Main类中展示了如何使用外观模式简化计算机的启动和关闭过程。
优点
- 简化接口:提供了一个简单易用的接口,隐藏了系统的复杂性。
- 解耦:将客户端与子系统解耦,客户端不需要直接与多个子系统打交道。
- 易于使用:使得客户端代码更加清晰简洁,降低了学习和使用成本。
缺点
- 可能隐藏系统复杂性:有时过于便利的外观可能会导致客户端对系统实际工作方式的理解不足。
- 不符合开闭原则:如果需要修改系统行为,可能需要修改外观类。
适用场景
- 当需要简化复杂系统的接口,提供一个更高层次的接口给客户端时。
- 当需要对系统进行解耦,使得不同部分可以独立修改时。