设计模式之外观模式

一、介绍

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

}

测试

四、优缺点

优点:

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

缺点:

  • 引入了多余的外观类。因为没有外观类,同样可以实现一样的结果
相关推荐
·薯条大王7 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
用户938515635078 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
ZJH__GO10 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆11 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu12 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官13 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.10513 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计