掘金 后端 ( ) • 2024-03-30 09:46

theme: qklhk-chocolate highlight: a11y-dark

外观模式(Facade Pattern) 是一种结构型设计模式,提供了一个统一的接口,用于访问系统中的一群接口。外观模式定义了一个高层接口,使得系统更加容易使用。

外观模式就好像是计算机的电源按钮一样。我们只需要按下电源按钮,整个计算机就能启动了。但是我们不需要知道电源按钮背后的复杂操作,比如电流如何流动、芯片如何工作等等。按下按钮就能启动计算机,这就是外观模式的精髓。

想象一下,如果没有电源按钮,我们就必须手动启动每个部件,比如调节 CPU、内存和硬盘。这样就会很麻烦,而且容易出错。但是有了电源按钮,我们只需要按一下,整个计算机就会自动启动,这就是外观模式的作用。

外观模式就是提供了一个简单的接口(就像电源按钮一样),来隐藏复杂系统的细节。我们不需要了解每个部件如何启动,只需要按下按钮,计算机就能工作了。

主要角色:

  1. 外观(Facade): 提供了系统的一个简化接口,它包含了系统中各个模块的方法,并通过调用这些方法来完成系统的功能。
  2. 子系统(Subsystem): 实现了系统的各个模块,处理外观指派的任务。

示例:

我们使用java代码实现一下上面这个计算机的例子,计算机由多个子系统组成,包括 CPU、内存和硬盘。外观模式可以提供一个统一的接口来启动和关闭计算机,而不需要了解各个子系统的具体操作。

package com.luke.designpatterns.facadePattern;

// 子系统 - CPU
class CPU {
    public void start() {
        System.out.println("CPU正在启动");
    }

    public void shutdown() {
        System.out.println("CPU已经关闭");
    }
}

// 子系统 - 内存
class Memory {
    public void start() {
        System.out.println("内存已经启动");
    }

    public void shutdown() {
        System.out.println("内存已经关闭");
    }
}

// 子系统 - 硬盘
class HardDrive {
    public void start() {
        System.out.println("硬盘已经启动");
    }

    public void shutdown() {
        System.out.println("硬盘已经关闭");
    }
}

// 外观
class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public ComputerFacade() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }

    public void start() {
        System.out.println("电脑正在启动...");
        cpu.start();
        memory.start();
        hardDrive.start();
        System.out.println("电脑启动成功");
    }

    public void shutdown() {
        System.out.println("电脑正在关闭...");
        cpu.shutdown();
        memory.shutdown();
        hardDrive.shutdown();
        System.out.println("电脑关闭成功");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();

        // 启动计算机
        computer.start();

        // 关闭计算机
        computer.shutdown();
    }
}

image.png

在这个例子中,CPUMemoryHardDrive 是子系统,它们提供了启动和关闭的操作。ComputerFacade 是外观,提供了一个简化的接口 start()shutdown(),它通过调用子系统的方法来完成启动和关闭的任务。客户端只需要与外观对象交互,而不需要了解系统中各个子系统的具体实现。这有助于降低系统的复杂性,提供了一个更简单、更清晰的接口。

适用场景

外观模式适用于以下情况:

  1. 复杂系统的简化接口需求: 当一个系统由多个子系统组成,并且这些子系统之间存在复杂的依赖关系或交互,但客户端只需简单地与系统进行交互时,外观模式就非常适用。它提供了一个简化的接口,隐藏了子系统的复杂性。
  2. 减少依赖和耦合: 外观模式可以减少客户端与子系统之间的直接依赖,从而降低系统的耦合度。客户端只需要与外观类进行交互,而不需要了解子系统的具体实现细节。
  3. 子系统功能的统一入口: 当需要对一个复杂系统进行重构或修改时,外观模式提供了一个统一的入口点。这样,如果子系统的实现发生变化,只需要更新外观类而不影响客户端。
  4. 简化复杂操作流程: 外观模式可以将复杂的操作流程封装在一个简单的接口中,使得客户端能够更加方便地使用系统,同时降低了出错的可能性。

总之,外观模式适用于需要简化复杂系统接口、降低耦合度、统一子系统入口以及简化操作流程的场景。