「聊设计模式」之外观模式(Facade)

news2024/11/25 14:20:32

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  设计模式是一种通用的解决问题的方式,它不仅仅是在编程中有用,还可以应用于软件工程的其他方面。外观模式(Facade)是一种结构型设计模式,它为一个复杂的子系统提供了一个简单的接口。

摘要

  外观模式为客户端提供了一个简单的接口,从而隐藏了子系统的复杂性。它通过减少客户端与子系统之间的耦合来提高系统的可维护性和可扩展性。在外观模式中,一个外观类(Facade)提供了一个简单的接口,隐藏了子系统的复杂性,客户端与子系统之间的交互都通过外观类来进行。

外观模式

何为外观模式?

结构

  外观模式是一种结构型设计模式,它提供了一个统一的接口,以便于访问子系统中的一群接口。

外观模式包含以下几个角色:

  1. 外观(Facade):为客户端提供了一个简单的接口,客户端通过外观访问子系统中的一群接口。
  2. 子系统(Subsystem):实现了子系统的功能,处理由外观对象指派的任务。对于子系统内部的模块,外观不需要知道具体的实现方式。
  3. 客户端(Client):通过外观访问子系统中的一群接口,客户端可以直接调用外观提供的方法,而不需要了解子系统内部的实现细节。

其外观模式结构图如下所示:

在这里插入图片描述

  外观模式的实现中,外观类的职责是将客户端和子系统解耦,客户端不需要了解子系统内部的实现细节,只需要知道如何使用外观类提供的接口即可。外观类对于客户端来说是一个黑盒子,客户端只需要知道如何使用即可。

应用场景

外观模式适用于以下场景:

  • 当一个系统有多个子系统,并且这些子系统之间互相合作以完成一个复杂的任务时;
  • 当客户端需要与系统交互,并且需要了解系统的内部结构和工作原理时;
  • 当需要简化一个复杂的系统,并且需要提供一个简单的接口时。

优缺点

外观模式的优点如下:

  • 简化了客户端与子系统之间的交互,减少了客户端的复杂性;
  • 隐藏了子系统的复杂性,提高了系统的可维护性和可扩展性;
  • 降低了客户端与子系统之间的耦合,提高了系统的灵活性和可移植性。

外观模式的缺点如下:

  • 外观模式可能会导致系统的性能下降,因为客户端需要调用外观类来间接访问子系统;
  • 外观模式可能会使系统变得更加复杂,因为需要引入一个额外的外观类来封装子系统。

实现方式

外观模式的实现方式如下:

  • 定义一个外观类(Facade),它提供了一个简单的接口,隐藏了子系统的复杂性;
  • 外观类中包含子系统的实例变量,并且通过这些实例变量来与子系统进行交互;
  • 客户端只需要与外观类交互,并且不需要知道子系统的具体实现细节。

模式的实现

  下面是一个简单的外观模式的代码示例,它演示了如何使用外观模式来隐藏子系统的复杂性:

子系统A

package com.example.javaDesignPattern.facade;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/19 15:56
 */
public class SubSystemA {
    public void methodA() {
        System.out.println("SubSystemA.methodA()");
    }
}

子系统B

package com.example.javaDesignPattern.facade;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/19 15:59
 */
public class SubSystemB {
    public void methodB() {
        System.out.println("SubSystemB.methodB()");
    }
}

子系统C

package com.example.javaDesignPattern.facade;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/19 16:00
 */
public class SubSystemC {
    public void methodC() {
        System.out.println("SubSystemC.methodC()");
    }
}

外观类

package com.example.javaDesignPattern.facade;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/19 16:00
 */
public class Facade {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    private SubSystemC subSystemC;

    public Facade() {
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
        subSystemC = new SubSystemC();
    }

    public void method() {
        subSystemA.methodA();
        subSystemB.methodB();
        subSystemC.methodC();
    }
}

客户端


package com.example.javaDesignPattern.facade;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/19 16:01
 */
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.method();
    }
}

  在这个例子中,SubSystemASubSystemBSubSystemC是三个不同的子系统,它们各自完成各自的任务。Facade是一个外观类,它提供了一个简单的接口来隐藏子系统的复杂性。客户端只需要与Facade交互,并且不需要知道子系统的具体实现细节。

测试用例

为了测试外观模式的实现,我们可以编写以下测试用例:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.method();
    }
}

运行这个测试用例后,我们会发现输出了以下结果:

SubSystemA.methodA()
SubSystemB.methodB()
SubSystemC.methodC()

这表明外观模式的实现是正确的。

执行截图如下:
在这里插入图片描述
代码解析:

  这段代码演示了外观模式(Facade Pattern)的使用,其中:

  • 客户端创建了一个 Facade 对象并调用它的 method 方法。
  • Facade 对象内部封装了多个子系统的功能接口,此处并未展示具体实现。
  • 客户端无需了解每个子系统的具体实现,只需要调用 Facade 的方法即可完成相关操作。

  外观模式可以简化系统的复杂度,降低耦合度,使得客户端更容易使用和维护系统。

小结

  外观模式是一种结构型设计模式,它为一个复杂的子系统提供了一个简单的接口。它通过减少客户端与子系统之间的耦合来提高系统的可维护性和可扩展性。在外观模式中,一个外观类(Facade)提供了一个简单的接口,隐藏了子系统的复杂性,客户端与子系统之间的交互都通过外观类来进行。

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

  设计模式是一种通用的解决问题的方式,它可以应用于软件工程的各个方面。外观模式是一种结构型设计模式,它为一个复杂的子系统提供了一个简单的接口。在实际开发中,我们可以使用外观模式来简化系统的复杂性,提高系统的可维护性和可扩展性。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL常见面试题(二)

😀前言 在数据库管理和操作中,我们常常需要深入理解其各种数据类型、特性和索引类型来优化我们的数据库设计和查询效率。其中,字符串类型和它们如何在MySQL中实现和使用成为了一个必不可少的知识点。同时,我们也需要理解新的特性&…

基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老师没见过、当场唬住!)

高校实习管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统主要功能5.1…

若依cloud -【 100 ~ 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…

Vue 3 + TypeScript + jsplumb

网上搜了很久,没有找到基于vue3写的jsplumb,如是写了一个简单版,已开源 Vue 3 TypeScript jsplumb 支持回显,拖拽,连线的基础功能

十分钟理解OSPF路由协议

十分钟理解OSPF路由协议 1.RIP的缺陷以跳数为度量值最大跳数为15更新路由表采用全更新收敛速度慢 2.RIP与OSPF比较OSPF概述运行OSPF协议之前运行OSPF协议之后 3.OSPF协议工作过程1.发现邻居2.建立邻接关系3.传递链路状态信息4.计算路由 4.OSPF分区域管理 有RIP协议,…

Spring学习(三):MVC

一、什么是MVC MVC(Model-View-Controller)是一种软件设计模式,用于组织和管理应用程序的代码结构。它将应用程序分为三个主要部分,即模型(Model)、视图(View)和控制器(…

WPS 换行后缩进、加粗等自定义样式的清除

在使用WPS的Word编辑文字时,经常会出现换行后,自动缩进这种格式,需要清除这种样式,可以按照下图来操作:

无锡矽杰微电子----XC8P9520MCU之项目开发

上篇文章说了开发环境和烧录环境的配置以及安装,那么接下来就需要开发项目了。 Demo文件资料-无锡矽杰微电子有限公司 (xjmcu.com) 这里贴上矽杰微官网的资料下载专区,包括不同芯片的DEMO和上文所说的工具。 既然是项目开发,那么芯片的数据手…

SaaS架构C/S检验科LIS系统源码: 检验申请、标本编号、联机采集

适用于医院检验科实际需要的LIS管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和…

无涯教程-JavaScript - MDETERM函数

描述 MDETERM函数返回数组的矩阵行列式。 语法 MDETERM (array)争论 Argument描述Required/OptionalArrayA numeric array with an equal number of rows and columns.Required Notes 数组可以作为单元格范围给出,如A1:C3;作为数组常量,如{1,2,3; 4,5,6; 7,8,9}&#xff1…

工业物联网大数据解决方案:排水设备远程监控和大数据统计系统

一、项目背景 给排水系统,作为城市的基础设施建设,是居民生产生活的必要保障。由于给排水系统通常站点零散分布,运维管理涉及的区域广泛,水位、流量、机泵运行等运行参数的测报,目前采取人工测量的,上令下…

如何评价低代码平台在企业复杂应用场景中的适用性?

随着编程语言的不断迭代、抽象、简化和整合,低代码技术正不断精进,形成更为简单清晰的图形化界面与高级语言结合的开发模式。在数字化转型方案的实施过程中,低代码开发广泛适用于各种应用场景,能够减少繁琐的重复性代码编写工作&a…

Docker安装与卸载

Docker安装与卸载 安装 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken更新本地镜像源 打开终端或 SSH 连接到 Rocky Linux 的服务器。 进入 /etc/yum.repos.d/ 目录,该目录包含 Rocky Linux 的 yum 配置文件。 cd /etc/yum.repo…

二维码智慧门牌管理系统:提升城市管理效率与便捷性

文章目录 前言一、二维码智慧门牌管理系统的基本原理二、二维码智慧门牌管理系统的开发解决方案三、二维码智慧门牌管理系统的优势 前言 随着科技的不断发展,城市管理模式也在不断升级与优化。其中,二维码智慧门牌管理系统的出现,为城市管理…

电脑提示找不到msvcr120.dll无法继续执行代码,哪个修复方法更简单

电脑报错“找不到msvcr120.dll无法继续执行代码”。我相信,对于许多使用电脑的朋友来说,这个问题并不陌生。我们在使用电脑的过程中,可能会遇到各种各样的问题,其中就包括了找不到msvcr120.dll这个文件的问题。那么,这…

SF506DS-ASEMI超快恢复二极管SF506DS

编辑:ll SF506DS-ASEMI超快恢复二极管SF506DS 型号:SF506DS 品牌:ASEMI 封装:TO-252 特性:贴片、快恢复二极管 正向电流:5A 反向耐压:600V 恢复时间:35ns 引脚数量&#xf…

ICS TRIPLEX T8403调节器模块产品特点

ICS TRIPLEX T8403 是一款调节器模块,通常用于工业自动化和控制系统中,主要用于监测和控制过程变量以确保系统的稳定性和性能。以下是该产品的一些主要特点: 高精度调节: T8403 调节器模块通常具有高精度的控制功能,可…

网络安全(黑客技术)学习笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

CDH大数据平台集群部署

文章目录 1. 资源准备2. 部署 Mariadb 数据库3. 安装CM服务4. 安装数据节点5. 登录CM系统 1. 资源准备 准备好CDH安装包资源,官方网站下载需要账号,如果没有账号可以去网上到处搜搜。主要涉及到的资源有: cloudera-manager-servercloudera-m…

IEEE模板中没有.bib相关内容怎么添加?

为了加深个人对该问题的记忆,特在此进行记录。 下图是IEEE某期刊提供的期刊模板,该模板来自于IEEE-Template Selector 从图中并没有看到bib文件,而在main.tex中也并没有相关引导,只是提到: 那如何添加呢?…