【设计模式-7】门面模式的代码实现和应用场景

 门面模式,最简单的结构性设计模式,将多个不同的子系统逻辑封装起来,对外提供统一的调用接口。门面模式又叫做外观模式,可能是我们接触最多的模式,在开发中,可能不经意间就用到了门面模式。

1. 概述

门面模式 的官方定义是:客户端和多个子系统的通信会通过一个统一的外观角色进行,这个角色为子系统中的一组接口提供了一个一致的入口,它是一种结构性的设计模式

在这里插入图片描述
 根据单一职责的描述,在软件中会将一个系统划分成为若干个子系统,这有利于降低整个系统的复杂性。但多个系统之间存在同步或者异步的交互关系,拓扑结构极为复杂,为了解决这种情况,一个常见的设计方式便是引入一个外观的角色,使得外部客户端与子系统之间的相互依赖关系达到最小。

 门面模式是迪米特法则的最佳体现,引入一个新的外观角色可以降低系统的复杂度,同时也能降低客户类和子系统的耦合度。举个开发中常见的门面模式,controller层对多个数据表进行保存,会调用到多个表对应的service层,但是我们一般会在service层封装一个专用外观类来实现对多个表保存的逻辑,controller层只需要与这个外观类交互就可以。

 在门面模式中,通常存在两个角色:

  • 外观角色:与客户端交互的类,封装了子系统的交互逻辑,对外提供统一的访问入口。
  • 子系统:子系统是一个广义的概念,可以是一个类、一个功能模块或者是一个完整的子系统。子系统能够实现具体的功能。

2. 代码实现

 我们来看一个代码实现,需求是要求实现读取本地文件,加密后从新存储的功能。这个需求可以拆分成3个模块来实现,1.文件读取 → 2.内容加密 → 3.写入磁盘。如下是代码实现:

  • 1. 子系统
// 1.文件阅读
public class FileReader {// 文件读取public String read(String path) {StringBuffer stringBuffer = new StringBuffer();// 读取本地文件try (FileInputStream fileInputStream = new FileInputStream(path)) {// 获取流信息并且转为字符串返回int data;while ((data = fileInputStream.read()) != -1) {stringBuffer.append((char)data);}} catch (Exception e) {e.printStackTrace();}return stringBuffer.toString();}
}// 2.字符串加密
public class EncryptOperate {// AES算法加密public String encrypt(String content) {//随机生成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();//构建SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);//加密为16进制表示String encryptHex = aes.encryptHex(content);return encryptHex;}
}// 3.保存文件到本地
public class FileWriter {// 写入文件public void write(String encrypt, String path) {// 写入本地try (FileOutputStream outputStream = new FileOutputStream(path)) {outputStream.write(encrypt.getBytes(StandardCharsets.UTF_8));} catch (Exception e) {e.printStackTrace();}}
}
  • 2. 门面类
// 门面类
public class Facade {private FileReader fileReader;private EncryptOperate encryptOperate;private FileWriter fileWriter;Facade() {this.fileReader = new FileReader();this.encryptOperate = new EncryptOperate();this.fileWriter = new FileWriter();}// 文件操作public void operate(String path) {String content = fileReader.read(path);String encrypt = encryptOperate.encrypt(content);fileWriter.write(encrypt, "/user/xxx/file/设计模式.txt");}
}
  • 3. 客户端
// 客户端
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operate("/user/xxx/file/设计模式.txt");}
}

3. UML类图

 根据上述代码实现,我们来画一下这个Demo的类图。
在这里插入图片描述

4. 抽象门面角色的引入

 在实际开发中,如果遇到多种门面类的实现场景,可以增加一个抽象的门面角色,让客户端与抽象的门面类交互。这样在遇到新的门面实现类时,不用修改原来的代码,增加一个实现就可以,也符合开闭原则。

5. 总结

 门面模式优点如下:

  • 门面模式对客户端屏蔽了子系统的复杂拓扑关系,使得客户端的调用逻辑简单直接,理解和改动的成本降低。
  • 子系统和客户端之间松耦合,当需要增加新的门面实现逻辑时,可以新增一整套子系统的逻辑实现,符合开闭原则。

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

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

相关文章

设计模式之组合模式【结构型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

极客时间-读多写少型缓存设计

背景 内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记,欢迎大家学习!https://time.geekbang.org/column/article/596644 总览内容如下: 缓存性价比 一般来说,只有热点数据放到缓存才更有价值 数据量查询频率命中…

Dubbo接口测试没你想的那么高大上

主题:Dubbo接口测试没你想的那么高大上 一、Dubbo是什么? Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架一款分布式服务框架、高性能和透明化的RPC远程服务调用方案、SOA服务治理方案下图是阿里巴巴技术解决方案演变图,从单应用->…

CAN201 计网概念收集

Lecture 1 the theoretical basis for networking Network edge and core 地理覆盖范围:广WAN,城MAN,局LAN,个PAN 交换方式,电路,报文,分组 电路交换vs报文vs分组 Network performance pr…

文件上传进阶绕过技巧(一)和靶场实战

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 0、环境准备 请移步《文件上传靶场实战:upl…

倍福CX8090嵌入式PLC新风控制开发

实现新风系统控制的方法与硬件配置、软件编程以及控制需求等因素有关。以下是一个简化的示例,说明如何使用倍福CX8090 PLC来实现新风系统的控制: 硬件配置: 倍福CX8090 PLC温度和湿度传感器风阀执行器显示屏软件编程: 使用倍福的…

深度解析Java中的ReadWriteLock:高效处理并发读写操作

第1章:引言 大家好,我是小黑,今天咱们聊聊读写锁。当多个线程同时对同一数据进行读写操作时,如果没有合理的管理,那数据就乱套了。就好比小黑在写日记,突然来了一帮朋友,大家都想往日记本上写点…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

基于 NFS 的文件共享实现

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过 TCP/IP 网络共享文件资源,服务端通过 NFS 共享文件目录,客户端将该文件目录挂载在本地文件系统中,就可以像操作本地文件一样读写服务…

【AI之路】使用huggingface_hub通过huggingface镜像站hf-mirror.com下载大模型(附代码,实现大模型自由)

文章目录 前言一、Hugging face是什么?二、huggingface镜像站hf-mirror.com三、大模型一键下载1. 准备工作2. 下载代码 总结后记 前言 要玩AI大模型,Hugging face 不可错过,但资源虽不错,可奈何国内下载速度很慢,动则…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑦

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷7 目录 需要竞赛软件包环境以及备赛资源可私信博主!!! 2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷7 模块一 …

数学经典教材有什么?

有本书叫做《自然哲学的数学原理》,是牛顿写的,读完之后你就会感叹牛顿的厉害之处! 原文完整版PDF:https://pan.quark.cn/s/5d5eac2e56af 那玩意真的是人写出来的么… 现代教材把牛顿力学简化成三定律,当然觉得很简单。只有读了原…