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

 结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有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://www.hqwc.cn/news/675017.html

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

相关文章

产品需求文档怎么写?超详细的产品需求文档PRD模板来了!

产品需求文档怎么写?如何写一份简洁明了、外行人看了就能秒懂的产品需求文档呢?今天这篇文章,就来和大家分享如何编写一份高质量的产品需求文档 PRD! 下图是来自 boardmix 模板社区的「产品需求文档」模板,它给出了一…

区间预测——conformal tights

conformal tights 是一个python包 特征: sklearn元估计器:向任何scikit-learn回归器添加分位数和区间的共形预测 darts预测:向任何scikit-learn回归器添加共形校准的概率预测 保形校准:准确的分位数和可靠的覆盖的区间 相干分…

VS Code中PlatformIO IDE的安装并开发Arduino

VS Code中PlatformIO IDE的安装并开发Arduino VS Code的安装 略 PlatformIO IDE的安装 PlatformIO IDE是是什么 PlatformIO IDE 是一个基于开源的跨平台集成开发环境(IDE),专门用于嵌入式系统和物联网(IoT)开发。…

小白入门:创建一个SpringBoot项目

前言 我们在创建SpringBoot项目时候,会出现不确定和报错的情况很多,大家可以按照我的做法来简单创建一个SpringBoot项目 1.环境配置 下载安装并配置jdk1.8下载apache mavenidea软件 2.开始创建项目 Server URL:初始是start.spring.io,我…

【计算机科学速成课】笔记三——操作系统

文章目录 18.操作系统问题引出——批处理设备驱动程序多任务处理虚拟内存内存保护Unix 18.操作系统 问题引出—— Computers in the 1940s and early 50s ran one program at a time. 1940,1950 年代的电脑,每次只能运行一个程序 A programmer would write one at…

栈数据结构

1,概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈(push)&#x…

绘画作品3d数字云展厅提升大众的艺术鉴赏和欣赏能力

3D虚拟展厅作为未来艺术的展示途径,正逐渐成为文化创意产业蓬勃发展的重要引擎。这一创新形式不仅打破了传统艺术展览的局限性,更以其独特的魅力吸引着全球观众的目光。 3D虚拟艺术品展厅以其独特的魅力,助力提升大众的艺术鉴赏和欣赏能力。观…

北京车展现场体验商汤DriveAGI自动驾驶大模型展现认知驱动新境界

在2024年北京国际汽车展的舞台上,众多国产车型纷纷亮相,各自展示着独特的魅力。其中,小米SUV7以其精美的外观设计和宽敞的车内空间,吸引了无数目光,成为本届车展上当之无愧的明星。然而,车辆的魅力并不仅限…

Penpad再获 Presto Labs 投资,Scroll 生态持续扩张

​Penpad 是 Scroll 生态的 LaunchPad 平台,其整计划像收益聚合器以及 RWA 等功能于一体的综合性 Web3 平台拓展,该平台在近期频获资本市场关注,并获得了多个知名投资者/投资机构的支持。 截止到本文发布前,Penpad 已经获得了包括…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代,截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记,还是日常沟通,一款好用的截图工具都能大大提升我们的效率。今天,我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…

Flutter实战记录-协作开发遇到的问题

一.前言 Android项目使用了混合架构,部分模块使用Flutter进行开发。在电脑A上开发的项目提交到git仓库,电脑B拉取后进行操作,遇到两个问题,特此做一下记录; 二.问题A Settings file ‘D:\xxx\settings.gradle’ line…

LeetCode:盛最多水的容器

文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1,a2,…,an,每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线,垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线,使得它们与…