Java设计模式之—外观模式
外观模式是一种软件设计模式,它为复杂的子系统提供了一个统一的接口,使得这些子系统更加容易被访问或使用。它的主要目标是提供一个高层次的接口,隐藏子系统的复杂性。
主要解决什么问题
外观模式主要解决的是子系统与客户端之间的紧耦合问题,使得客户端可以更简单地调用子系统的功能,而不需要关心子系统内部的复杂实现细节。
在什么时候我们需要使用外观模式
当我们要为一个复杂的子系统提供一个简单的接口时,或者当我们要解耦子系统与其客户端之间的关系时,我们需要使用外观模式。
生活中的应用实例
假设你到了一个新城市,你可能需要使用各种服务,比如餐饮、住宿、交通等。你可以选择自己去找各个服务提供者,这就像直接使用子系统。但如果有一个旅行代理(外观)提供了所有这些服务的接入点,你只需要和旅行代理打交道,就可以得到你需要的所有服务,这会使你的生活更加简单。
优点
对客户端屏蔽子系统组件,减少了客户处理的对象数目并使子系统使用起来更容易。
实现了子系统与客户端之间的松耦合关系。
缺点
不符合开闭原则,如果业务复杂则会导致类的数量增多,增加了系统的复杂性。
如果不正确或过度使用外观模式,可能会导致系统的设计变得复杂或难以理解。
使用场景
当需要为一个复杂的子系统提供一个简单的接口时。
客户端与子系统之间存在很多依赖时。
代码示例
假设我们有一个复杂的电脑系统,包括CPU、内存和硬盘三个子系统。我们可以创建一个外观类来简化与这些子系统的交互。
//子系统
class CPU {
public void start() {
System.out.println("CPU is start...");
}
}
class Memory {
public void start() {
System.out.println("Memory is start...");
}
}
class Disk {
public void start() {
System.out.println("Disk is start...");
}
}
//外观类
class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start() {
System.out.println("Computer start begin");
cpu.start();
memory.start();
disk.start();
System.out.println("Computer start end");
}
}
//客户端
public class FacadePatternDemo {
public static void main(String[] args) {
Computer computer = new Computer();
computer.start();
}
}
在这个示例中,我们创建了一个Computer类作为外观,提供了一个start方法,将启动电脑的复杂过程封装起来。客户端只需要调用这个方法,就可以启动电脑,不需要关心具体的实现细节。