Java设计模式:外观模式之优雅门面(九)

在这里插入图片描述

码到三十五 : 个人主页

心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !


在软件工程中,设计模式是解决常见设计问题的经验总结,它为开发者提供了一种通用的、可复用的解决方案。外观模式(Facade
Pattern)作为结构型设计模式的一种,通过为子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。

目录

    • 一、外观模式的起源与背景
    • 二、外观模式的组件
      • 2.1. Facade(外观类)
      • 2.2. Subsystem Classes(子系统类)
      • 2.3. Client(客户端)
    • 三、外观模式的优势分析
    • 四、外观模式实现方式
    • 五、外观模式的应用场景举例
    • 总结

[参见]:

Java设计模式:核心概述(一)

Java设计模式:单例模式之六种实现方式详解(二)

Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)

Java设计模式:建造者模式之经典与流式的三种实现(四)

Java设计模式:适配器模式的三种形式(五)

Java设计模式:深入装饰器模式的三种写法(六)

Java设计模式:组合模式之透明与安全的两种实现(七)

Java设计模式:代理模式的静态和动态之分(八)

一、外观模式的起源与背景

在复杂的软件系统中,往往存在多个子系统或组件协同工作的情况。这些子系统可能由不同的团队开发,使用不同的技术栈,具有各自独特的接口和依赖关系。当客户端需要使用这些子系统时,可能需要了解并调用多个接口,处理复杂的依赖关系,这无疑增加了客户端的使用难度。

为了解决这个问题,外观模式应运而生。它通过一个外观类(Facade)来整合子系统中的接口,为客户端提供一个统一的、更简单的接口。客户端只需与外观类交互,而无需了解子系统的具体实现细节和复杂性。

二、外观模式的组件

在这里插入图片描述

2.1. Facade(外观类)

  • 外观类是外观模式的核心组件,它提供了客户端所需的统一接口。
  • 外观类内部持有对子系统对象的引用,负责将客户端的请求转发给相应的子系统对象处理。
  • 外观类可以对子系统的接口进行封装和抽象,使得客户端无需了解子系统的具体实现细节。
  • 外观类还可以对子系统的返回结果进行整合和处理,以更友好的方式呈现给客户端。

2.2. Subsystem Classes(子系统类)

  • 子系统类是实现具体功能的类,它们可能具有复杂的接口和相互依赖关系。
  • 在外观模式中,子系统类被隐藏起来,客户端不直接访问它们。而是通过外观类来间接访问子系统。
  • 子系统类之间可能存在复杂的交互和协作关系,但这些细节对客户端来说是透明的。

2.3. Client(客户端)

  • 客户端是使用外观类来访问子系统的类。
  • 客户端只需了解外观类提供的接口,而无需了解子系统的具体实现细节和复杂性。
  • 通过使用外观类,客户端可以更加简洁、方便地访问子系统,降低了客户端的使用难度和耦合度。

三、外观模式的优势分析

  1. 简化客户端使用:通过提供一个统一的接口,外观模式使得客户端可以更加简洁、方便地访问子系统。客户端无需了解子系统的复杂性和实现细节,只需调用外观类提供的方法即可完成操作。这降低了客户端的使用难度和学习成本。
  2. 降低耦合度:外观模式将客户端与子系统解耦,客户端只需与外观类交互,而无需直接依赖子系统。当子系统发生变化时,只需要修改外观类而无需修改客户端代码。这提高了系统的可维护性和可扩展性。
  3. 隐藏系统复杂性:外观类封装了子系统的实现细节和复杂性,为客户端提供了一个清晰的、一致的视图。这使得客户端可以专注于自己的业务逻辑,而无需关心子系统的具体实现和交互细节。这有助于保护子系统的内部结构和实现细节不被外部直接访问和修改。
  4. 提高系统灵活性:通过引入外观类作为中介层,我们可以更加灵活地组织和管理子系统。我们可以根据需要添加、删除或修改子系统的组件,而无需修改客户端代码。这提高了系统的灵活性和可配置性。

四、外观模式实现方式

我们模拟一个银行系统,其中包括账户管理、贷款服务和存款服务等多个子系统。然后使用外观模式来提供一个统一的接口给客户端使用。

首先,我们定义几个子系统类(Subsystem Classes),这些类模拟了银行系统中的不同组件。

// 账户管理子系统
class AccountManagement {public void createAccount(String accountName) {System.out.println("为 " + accountName + " 创建账户。");}public void closeAccount(String accountName) {System.out.println("关闭 " + accountName + " 的账户。");}
}// 贷款服务子系统
class LoanService {public void applyForLoan(String accountName, double amount) {System.out.println(accountName + " 申请了 " + amount + " 的贷款。");}public void approveLoan(String accountName) {System.out.println(accountName + " 的贷款已被批准。");}
}// 存款服务子系统
class DepositService {public void deposit(String accountName, double amount) {System.out.println(accountName + " 存款 " + amount + "。");}public void withdraw(String accountName, double amount) {System.out.println(accountName + " 取款 " + amount + "。");}
}

接下来,我们创建外观类(Facade),该类将封装这些子系统类,并为客户端提供一个统一的接口。

// 银行外观类
class BankFacade {private AccountManagement accountManagement;private LoanService loanService;private DepositService depositService;// 构造函数,初始化子系统对象public BankFacade() {accountManagement = new AccountManagement();loanService = new LoanService();depositService = new DepositService();}// 提供给客户端的简化方法 - 开户并存款public void openAccountAndDeposit(String accountName, double amount) {accountManagement.createAccount(accountName);depositService.deposit(accountName, amount);System.out.println("开户并存款操作完成。");}// 提供给客户端的简化方法 - 申请贷款并批准public void applyAndApproveLoan(String accountName, double amount) {loanService.applyForLoan(accountName, amount);loanService.approveLoan(accountName);System.out.println("申请并批准贷款操作完成。");}// 提供给客户端的简化方法 - 取款并关闭账户public void withdrawAndCloseAccount(String accountName, double amount) {depositService.withdraw(accountName, amount);accountManagement.closeAccount(accountName);System.out.println("取款并关闭账户操作完成。");}
}

最后,我们创建客户端(Client)来使用外观类。

// 客户端
public class BankClient {public static void main(String[] args) {// 创建银行外观对象BankFacade bankFacade = new BankFacade();// 客户端通过银行外观对象调用操作bankFacade.openAccountAndDeposit("张三", 10000);bankFacade.applyAndApproveLoan("张三", 5000);bankFacade.withdrawAndCloseAccount("张三", 2000);}
}

客户端通过BankFacade类的简化方法来完成一系列复杂的操作,如开户并存款、申请贷款并批准、取款并关闭账户等。客户端无需了解子系统的具体实现细节和它们之间的交互方式。

运行BankClient类的main方法,看到以下输出:

为 张三 创建账户。
张三 存款 10000.0。
开户并存款操作完成。
张三 申请了 5000.0 的贷款。
张三 的贷款已被批准。
申请并批准贷款操作完成。
张三 取款 2000.0。
关闭 张三 的账户。
取款并关闭账户操作完成。

通过银行外观类,客户端成功地完成了一系列复杂的银行业务操作,而无需直接与各个子系统打交道。这样的设计降低了客户端与子系统之间的耦合度,提高了系统的可维护性和可扩展性。

五、外观模式的应用场景举例

  1. 在大型软件系统中整合不同模块:在大型软件系统中,往往存在多个模块或组件协同工作的情况。这些模块可能由不同的团队开发,具有各自独特的接口和依赖关系。通过使用外观模式,我们可以将这些模块的接口整合成一个统一的接口,使得其他模块可以更加简洁、方便地访问它们。
  2. 隐藏复杂系统的实现细节:当一个系统的实现细节非常复杂时,我们可以使用外观模式来隐藏这些细节。通过提供一个简化的接口给客户端使用,我们可以保护系统的内部结构和实现细节不被外部直接访问和修改。这有助于确保系统的稳定性和安全性。
  3. 在分布式系统中整合服务:在分布式系统中,往往存在多个服务协同工作的情况。这些服务可能部署在不同的服务器上,具有各自独特的接口和通信协议。通过使用外观模式,我们可以将这些服务的接口整合成一个统一的接口,使得客户端可以更加简洁、方便地访问它们。这降低了客户端与分布式系统之间的通信复杂性和耦合度。

总结

外观模式是一种非常实用的设计模式,它通过引入一个统一的接口来隐藏系统的复杂性,使得客户端可以更方便地使用子系统。在实际应用中,我们应该根据具体的需求和场景来选择合适的设计模式,以提高软件系统的可维护性、可扩展性和可重用性。外观模式为我们提供了一个有效的手段来简化客户端的使用和降低系统的复杂性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根证书和中间证书安装配置

下载根证书 根证书是建立信任链的基础。一旦客户端安装了根证书,它即可验证由该根证书签发的所有证书。这使得客户端可以信任与该根证书相关的所有服务器和应用程序,从而建立起一个完整的信任链。 如果您的业务用户通过浏览器访问您的Web业务&#xff…

鸿蒙TypeScript学习第10天:【String(字符串)】

1、TypeScript String(字符串) String 对象用于处理文本(字符串)。 语法 var txt new String("string"); 或者更简单方式: var txt "string"; 2、String 对象属性 下表列出了 String 对象支…

QA测试开发工程师面试题满分问答8: mysql数据库的索引定义、用途和使用场景

MySQL数据库索引是一种数据结构,用于提高数据库的查询效率。索引是基于表中的一个或多个列构建的,它们允许数据库系统快速定位和访问表中的特定数据,而无需扫描整个表。 索引的定义 在MySQL中,可以使用CREATE INDEX语句定义索引…

前端| 富文本显示不全的解决方法

背景 前置条件:编辑器wangEditor vue项目 在pc端进行了富文本操作, 将word内容复制到编辑器中, 进行发布, pc端正常, 在手机端展示的时候 显示不全 分析 根据h5端编辑器内容的数据展示, 看到有一些样式造…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统,提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwip、littlefs、hdf等子系统及组件的适配…

字符串...

String概述: java.lang.String类代表字符串,Java程序中的所有字符串文字(列如"abc")都为此类的对象. String name "我是一个小仙女"; String schoolName "天才程序员"; String的注意点 字符串的内容是不会发生改变的,它的对象在创建后不能…

实验 10_IPSEC Over GRE 实验

实验拓扑 实验需求 按照拓扑配置 IP 地址。AR1 与 AR3 部署静态路由。对 192.168.1.0/24 和 192.168.2.0/24 的流量进行数据 IPSCE 加密处理。部署 GRE 隧道和静态路由实现 PC1 与 PC2 通过加密 GRE 隧道实现互通。 实验配置之及其验证 (1)根据拓扑配置IP地址 (2)实现需求 2…

【安全工具】信息收集——ENScan_GO

1.初次使用 运行命令生成配置文件 ./enscan -v 2.配置cookie 参考介绍 wgpsec/ENScan_GO: 一款基于各大企业信息API的工具,解决在遇到的各种针对国内企业信息收集难题。一键收集控股公司ICP备案、APP、小程序、微信公众号等信息聚合导出。 (github.com) 3.友情提…

mac | Windows 本地部署 Seata2.0.0,Nacos 作为配置中心、注册中心,MySQL 存储信息

1、本人环境介绍 系统 macOS sonama 14.1.1 MySQL 8.2.0 (官方默认是5.7版本) Seata 2.0.0 Nacos 2.2.3 2、下载&数据库初始化 默认你已经有 Nacos、MySQL,如果没有 Nacos 请参考我的文章 : Docker 部署 Nacos(单机…

Redis的三种部署方案

文章目录 单机模式主从复制哨兵模式分片集群 在Redis中提供的集群方案总共有三种:单机模式,主从复制集群、哨兵模式,Redis分片集群 单机模式 Redis 只运行在一台服务器上,并且所有的数据都存储在这一台服务器的内存中。 主从复制…

小红不想做完全背包 (hard)(BFS最少操作)

本题链接:登录—专业IT笔试面试备考平台_牛客网 样例: 输入 4 3 1 2 3 4 输出 1 思路: 根据题意,要求拿去物品数量的最小值,也可以看作是最少操作拿取的次数。 所以我们应该联想到 BFS 搜索,以后遇到最小值…

推动科技创新润德生物邀您到场参观2024第13届生物发酵展

参展企业介绍 山东润德生物科技有限公司成立于2014年10月17日,是一家围绕生物制品的研发、生产、营销、国际贸易、技术服务为核心业务的国家高新技术企业,近年来荣获国家制造业单项冠军示范企业、国家级绿色工厂、国家知识产权优势企业、国家工业产品绿…

YOLOV8注意力改进方法:DoubleAttention(附代码)

原论文地址:原论文地址 DoubleAttention网络结构的优点在于,它能够有效地捕获图像中不同位置和不同特征的重要性,从而提高了图像识别和分割的性能。 论文相关内容介绍: 论文摘要:学习捕捉远程关系是图像/视频识别的…

【线段树】【前缀和】:1687从仓库到码头运输箱子

本题简单解法 C前缀和算法的应用:1687从仓库到码头运输箱子 本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 线段树 LeetCode1687从仓库到码头运输箱子 你有一辆货运卡车,你需要用这一辆车…

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于视频监管与AI智能识别技术的水利河道综合治理解决方案

一、方案介绍 TSINGSEE青犀视频水利河道综合治理解决方案是依托视频AI智能分析技术,利用水质/水文等传感器、高清摄像机、水利球、无人机、无人船等感知设备实时采集数据,并与视频能力进行联动,达到智能预警的目的。 TSINGSEE青犀方案以信息…

24考研-东南大学916经验贴

文章目录 一、个人情况二、初试备考经验1.政治 67,客观382.英语 60,客观大概40左右3.数学 136,客观应该满分4.专业课 数据结构计网 114小分不清楚 三、复试备考经验笔试:C面试复试流程 附一下成绩单: 一、个人情况 本…

K8s学习四(资源调度_1)

资源调度 发现对Pod操作不方便,不能直接操作,而且不能直接编辑,需要对原来的配置文件进行操作,而且需要删除之后再创建Pod,不方便,更多是通过控制器来操作。 Label和Selector 通过设置标签和选择器来确定…

配置 施耐德 modbusTCP 分布式IO子站 PRA0100

模块官方介绍:https://www.schneider-electric.cn/zh/product/BMXPRA0100 1. 总体步骤 2. 软件组态:在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮,选择正确的 DIO …

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目,里面需要用到权限管理。这里说一下权限定义的大概,代码不多,主要讲原理和如何实现它。 一、权限管理的原理 权限…