设计模式之外观模式

一、介绍

外观模式(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("正在退出内存...");
    }

}

测试

四、优缺点

优点:

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

缺点:

  • 引入了多余的外观类。因为没有外观类,同样可以实现一样的结果
相关推荐
接着奏乐接着舞3 分钟前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java14 分钟前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev40 分钟前
kapt 替换为 KSP
android·java·kotlin
蜡台1 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
Larcher1 小时前
当 AI 学会写代码:一个自动生成 React 项目的 Agent 实战
人工智能·设计模式·程序员
程序员天天困1 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH1 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
怎么比啊都是大神3 小时前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫3 小时前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
观远数据3 小时前
从离线开发到实时同步:DataFlow如何支撑企业级数据治理闭环
java·windows·microsoft·excel