设计模式之外观模式

一、介绍

外观模式(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 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧6 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7257 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄7 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿7 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds7 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹7 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚7 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言