【再探】设计模式—适配器、装饰及外观模式

 结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种:适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。

1 适配器模式

需求:在软件维护阶段,已存在的方法与目标接口不匹配,需要个中间类来适配这个方法。

1.1 适配器模式介绍

将一个类的接口转换成客户端期望的目标类格式,使得原本不兼容的类可以一起工作。

图 适配器模式 UML

public class AdapterPattern {public static void main(String[] args) {SimpleEncrypt simpleEncrypt = new SimpleEncrypt();EncryptAdapter adapter = new EncryptAdapter(simpleEncrypt);String encrypt = adapter.encrypt("hello adapter");System.out.println(encrypt);}private interface Encrypt {String encrypt(String text);}private static class EncryptAdapter implements Encrypt{private static final int ENCRYPT_LENGTH = 15;private final SimpleEncrypt simpleEncrypt;private EncryptAdapter(SimpleEncrypt simpleEncrypt) {this.simpleEncrypt = simpleEncrypt;}@Overridepublic String encrypt(String text) {return simpleEncrypt.encrypt(text,ENCRYPT_LENGTH);}}private static class SimpleEncrypt {public String encrypt(String text,int length) {return text + length;}}}

对象适配器

在适配类中关联一共被适配者对象,通过调用被适配者对象的方法来实现适配。

类适配器

实现目标接口的同时,继承被适配者类。

接口适配器

通过一个抽象类来实现接口中的所有方法。具体类通过继承抽象类,根据需求只需要重写特定的方法。

表 适配器种类

1.2 优缺点

优点:

  1. 提高代码的复用性,让原本不兼容的类可以协同工作。
  2. 降低系统耦合度,客户端只与适配器进行交互。

缺点:

  1. 过度使用适配器可能导致系统变得复杂,难以理解和维护,也可能导致性能下降。

2 装饰模式

需求:1)想给给类添加新的功能。而不希望使用继承的方式。2)动态添加及撤销功能。

2.1 装饰模式介绍

在不改变一个对象的接口的前提下,通过创建一个装饰者来包裹真实对象,来动态地增加额外的职责到该对象

图 装饰模式 UML

完全透明

装饰对象和原始对象具有相同的接口,客户端不需要区分装饰对象及原始对象。

半透明

允许装饰对象的接口与原始对象的接口不完全一致。装饰对象的接口可能会比原始对象更宽,但仍需要实现原始对象的接口。

表 装饰模式的两种模式

public class DecoratorPattern {public static void main(String[] args) {String text = "hello decorator";Verifier noEmptyVerifier = new NoEmptyVerifier();Verifier minLengthVerifier = new MinLengthVerifier(noEmptyVerifier,7);System.out.println(minLengthVerifier.verification(text));}private interface Verifier {boolean verification(String text);}private static class NoEmptyVerifier implements Verifier {@Overridepublic boolean verification(String text) {return text != null && text.trim().length() > 0;}}private static class MinLengthVerifier implements Verifier {private final int DEFAULT_MIN_LENGTH = 15;private final Verifier verifier;private int minLength = DEFAULT_MIN_LENGTH;private MinLengthVerifier(Verifier verifier) {this.verifier = verifier;}public MinLengthVerifier(Verifier verifier, int minLength) {this.verifier = verifier;this.minLength = minLength;}@Overridepublic boolean verification(String text) {return verifier.verification(text) && text.length() > minLength;}}}

2.2 优缺点

优点:

  1. 提供了比继承更多的灵活性。
  2. 可以创建一个功能更加强大的对象,通过对一个对象进行多次装饰。
  3. 可以动态的添加及撤销功能。

缺点:

  1. 会产生很多小对象,如果过度使用,可能会导致程序变得复杂且难以维护。
  2. 在某些情况下,调试和排查问题的难度增加。

3 外观模式

需求:与系统交互时,不想与系统的其他业务模块产生关联,希望与一个统一的角色进行交互。

3.1 外观模式介绍

客户端与系统的通信通过一个统一的外观角色进行。

图 外观模式 UML

public class FacadePattern {public static void main(String[] args) { // 客户端SystemController controller = SystemController.getInstance();System.out.println(controller.getUser("facade"));}private static class SystemController { // 对外的接口private static volatile SystemController instance;public static SystemController getInstance() {if (instance == null) {synchronized (SystemController.class) {if (instance == null) {UserService service = new UserService(new UserMapper());instance = new SystemController(service);}}}return instance;}private final UserService userService;private SystemController(UserService userService) {this.userService = userService;}public String getUser(String username) {return userService.getUser(username);}}private static class UserService {private final UserMapper userMapper;private UserService(UserMapper userMapper) {this.userMapper = userMapper;}public String getUser(String username) {if (username == null) return "";return userMapper.searcherByUsername(username);}}private static class UserMapper {public String searcherByUsername(String username) {return "用户+" + username;}}}

3.2 优缺点

优点:

1)将客户端与系统内部模块分隔开,符合迪米特法则,降低了耦合度。

缺点:

1)不符合开闭原则。

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

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

相关文章

每日一题5:Pandas-修改列

一、每日一题 一家公司决定增加员工的薪水。 编写一个解决方案,将每个员工的薪水乘以2来 修改 salary 列。 返回结果格式如下示例所示。 解答: import pandas as pddef modifySalaryColumn(employees: pd.DataFrame) -> pd.DataFrame:employees.loc[…

最后一块石头的重量 II ,目标和,一和0

最后一块石头的重量 II(0-1背包问题 将石头尽可能分为两堆重量一样的,进行相撞则为0 class Solution {public int lastStoneWeightII(int[] stones) {int sum0;for(int x:stones){sumx;}int targetsum/2;int[] dpnew int[target1];//dp[j]表示最大石堆的…

【一起深度学习-----VGG】

VGG 原理图: 原理图: 为啥要使用VGG块呢? 对于AlexNet网络来说,虽然十分高效了,但是它并没有提供一个通用的模板,方便后续的研究。 故采用了模块化的思想,方便重复使用。 其实对比于AlexNet神经…

必应bing国内广告怎么做付费推广,提升产品曝光?

必应Bing作为微软旗下重要的搜索引擎平台,拥有着不可忽视的用户基础和市场潜力。对于寻求拓宽市场、提高品牌知名度的企业而言,利用必应Bing进行付费推广无疑是明智之选。通过必应Bing国内广告进行高效付费推广,助您轻松提升产品曝光度。 一…

C++:多态-虚函数

C 中的多态性是面向对象编程中的一个重要概念,它允许在运行时选择不同的函数实现,以适应不同类型的对象。 多态的种类 编译时多态性(Compile-time Polymorphism):也称为静态多态性或早期绑定,指在编译时确…

【Git】Git学习-13:Gitee和GitLab的使用

学习视频链接:【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 流程 1. 创建仓库/已有仓库 2. 克隆到本地/在远程仓库关联 git clone 仓库地址 git remote add 仓库别…

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目: 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置,完成设置。 添加依赖: 如果你的库需要额外的依赖,可以在 build.gradle (Module: app…

Axure中继器介绍以及案例分享

中继器是 Axure 中一个比较高阶的应用,它可以让我们在纯静态网页中模拟出类似带有后台数据交互的增删改查的效果。 一、中继器的基本使用方法: 整体流程分为三个步骤 ☆创建中继器 我们先在 Axured画布中拖入一个中继器元件 双击中继器后的效果 打开之…

APP 在华为应用市场上架 保姆级别详细流程

1、作为一名干开发的程序员,第一次能把自己的APP 上架,对自己来说是多么有意义的一项成就 2、创建一个 华为的开发者账号 根据提示填写完注册的信息https://developer.huawei.com/consumer/cn/product/华为开发者产品 | 开发者平台 | 流量变现 | 华为开…

商家制作微信小程序有什么好处?微信小程序的制作有哪些步骤和流程

微信小程序全面指南 微信小程序是微信生态系统中一项革命性的功能,为希望与庞大的微信用户群体互动的企业提供了独特的融合便捷性和功能性的体验。本全面指南深入探讨了微信小程序的世界,强调了其重要性、工作原理以及实际用例,特别是针对企…

CCE云原生混部场景下的测试案例

背景 企业的 IT 环境通常运行两大类进程,一类是在线服务,一类是离线作业。 在线任务:运行时间长,服务流量及资源利用率有潮汐特征,时延敏感,对服务SLA 要求高,如电商交易服务等。 离线任务&…

DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2,1306310-00-8,是一种重要的多肽化合物

一、试剂信息 名称:DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2CAS号:1306310-00-8结构式: 二、试剂内容 DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2是一种重要的多肽化合物,其CAS号为1306310-00-8。该多肽包含一个DO…

Spring_概述

Spring 官网Spring Framework(Spring)文档位置重点内容Overview 官网 Spring官网 Spring Framework(Spring) 文档位置 重点 IoC容器AOP:面向切面编程AOT:ahead of time,提前编译Web 框架&…

C++中的异常处理方式

目录 一、异常 二、C语言中对错误的处理 三、C中的异常处理 四、异常的抛出和捕获 五、异常的重新抛出 六、C标准库中的异常体系 七、异常的规范 一、异常 在C中,异常是程序运行期间发生的意外或错误情况。这些情况可能会导致程序无法继续正常执行,…

[译文] 恶意代码分析:1.您记事本中的内容是什么?受感染的文本编辑器notepad++

这是作者新开的一个专栏,主要翻译国外知名安全厂商的技术报告和安全技术,了解它们的前沿技术,学习它们威胁溯源和恶意代码分析的方法,希望对您有所帮助。当然,由于作者英语有限,会借助LLM进行校验和润色&am…

IOT-9608I-L ADC端口的使用(连续采样ADC值)

目录 概述 1 硬件介绍 1.1 认识硬件 1.2 引脚信号定义 2 软件功能实现 2.1 查看iio:device0下的接口信息 2.2 实现连续采样ADC 2.2.1 功能描述 2.2.2 代码实现 2.2.3 详细代码 3 测试 概述 本文主要讲述IOT-9608I-L ADC端口的使用方便,其内容包括板卡上的…

自动化机器学习——贝叶斯优化

自动化机器学习——贝叶斯优化 贝叶斯优化是一种通过贝叶斯公式推断出目标函数的后验概率分布,从而在优化过程中不断地利用已有信息来寻找最优解的方法。在贝叶斯优化中,有两个关键步骤:统一建模和获得函数的优化。 1. 统一建模 在贝叶斯优…

Windows端之Python3.9及以上高版本工程打包得到的exe逆向工程解包得到pyc文件进而得到py文件的流程实现

参考来自 【python逆向 pyc反编译】python逆向全版本通杀_python反编译pyc-CSDN博客https://blog.csdn.net/zjjcxy_long/article/details/127346296Pyinstaller打包的exe之一键反编译py脚本与防反编译_pyinstaller防止反编译-CSDN博客https://blog.csdn.net/as604049322/artic…

嵌入式RTOS面试题目

用过哪些嵌入式操作系统?使⽤RTOS和裸机代码开发有什么区别(优缺点)? 之前的⼀个项⽬是采⽤裸机代码开发的,写起来还⾏,通过状态机来管理业务逻辑和各种外设。 但是随着外设的增加,任务之间的…

【数学建模】天然肠衣搭配问题

2011高教社杯全国大学生数学建模竞赛D题 天然肠衣(以下简称肠衣)制作加工是我国的一个传统产业,出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段(原料),进入组装工序。传统的生产方式依靠人工…