设计模式之外观模式

一、介绍

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

}

测试

四、优缺点

优点:

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

缺点:

  • 引入了多余的外观类。因为没有外观类,同样可以实现一样的结果
相关推荐
悟空码字2 分钟前
SpringBoot + Redis分布式锁深度剖析,性能暴涨的秘密全在这里
java·spring boot·后端
奋进的芋圆3 分钟前
Spring Boot中实现定时任务
java·spring boot·后端
Jasmine_llq5 分钟前
《P3200 [HNOI2009] 有趣的数列》
java·前端·算法·线性筛法(欧拉筛)·快速幂算法(二进制幂)·勒让德定理(质因子次数统计)·组合数的质因子分解取模法
sww_10268 分钟前
xxl-job原理分析
java
星环处相逢8 分钟前
K8s 实战笔记:3 种发布策略 + YAML 配置全攻略
java·docker·kubernetes
BD_Marathon10 分钟前
Spring——容器
java·后端·spring
LaLaLa_OvO16 分钟前
spring boot2.0 里的 javax.validation.Constraint 加入 service
java·数据库·spring boot
Solar202517 分钟前
构建高可靠性的机械设备企业数据采集系统:架构设计与实践指南
java·大数据·运维·服务器·架构
慧一居士20 分钟前
jdk1.8 及之后的新版本介绍,新特性示例总结
java
eybk23 分钟前
拖放pdf转化为txt文件多进程多线程合并分词版
java·python·pdf