设计模式之外观模式

一、介绍

外观模式(Facade Pattern),又称为门面模式,属于结构型设计模式。外观模式为一组子系统的逻辑调用提供一个独立的接口调用。

在不使用外观模式的情况下,实现一个功能时需要按照一定的顺序对多个方法调用,因此我们需要关注对哪些方法进行调用,以及按照什么样的顺序。

而在外观模式中,我们通过调用外观类(Facade)的一个方法就可以实现该功能,该外观类(Facade)内部按照对应的顺序对这些方法进行调用,而具体按照什么样的顺序调用哪些方法我们无需关注,交给外观类(Facade)就可以了。

外观模式可以隐藏某个功能的内部逻辑细节,而提供给我们最简单的方式实现该功能。

二、外观模式中的角色

在外观模式中,包含以下三个角色:

  • 子系统(System)

功能的实际提供者,多个子系统共同实现一个功能。

  • 外观类(Facade)

将多个子系统的功能进行整合,并向客户端提供实现整合后功能的唯一接口。用于隐藏功能的内部细节。

  • 调用方(Client)

外观类的调用方,只需要关注外观类提供的功能,无需关注内部细节。

三、案例

外观类

java 复制代码
public class Computer {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public Computer() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }
    public void start() {
        System.out.println("启动计算机...");
        cpu.processData();
        memory.load();
        hardDrive.readData();
        System.out.println("计算机启动完毕!");
    }
    public void shutDown() {
        System.out.println("关闭计算机...");
        hardDrive.quit();
        memory.quit();
        cpu.quit();
        System.out.println("计算机关闭完毕!");
    }

}

子系统A

java 复制代码
public class CPU {
    public void processData() {
        System.out.println("正在处理数据...");
    }
    public void quit() {
        System.out.println("正在关闭CPU...");
    }
}

子系统B

java 复制代码
public class HardDrive {
    public void readData() {
        System.out.println("正在读取硬盘数据...");
    }
    public void quit() {
        System.out.println("正在退出硬盘...");
    }
}

子系统C

java 复制代码
public class Memory {
    public void load() {
        System.out.println("正在加载内存...");
    }
    public void quit() {
        System.out.println("正在退出内存...");
    }

}

测试

四、优缺点

优点:

  • 隐藏了功能细节,关注功能本身
  • 对客户端友好
  • 功能内聚

缺点:

  • 引入了多余的外观类。因为没有外观类,同样可以实现一样的结果
相关推荐
星沉远浦24 分钟前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530144 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快4 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码5 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking5 小时前
Java微服务练习方式
java·后端·微服务
朦胧之15 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅20 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪21 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly21 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨21 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++