【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式(一):适配器模式、装饰器模式

  • 1.适配器模式(Adapter)
  • 2.装饰器模式(Decorator)
    • 2.1 主要特点
    • 2.2 组成部分
    • 2.3 示例代码
      • 2.3.1 Component 组件
      • 2.3.2 ConcreteComponent 具体组件
      • 2.3.3 Decorator 装饰器
      • 2.3.4 ConcreteDecorator 具体装饰器
      • 2.3.5 客户端代码
    • 2.4 总结

1.适配器模式(Adapter)

适配器模式Adapter Pattern)是一种结构型设计模式,其主要目的是通过适配器将一个接口转换为客户端所期望的另一个接口。这个模式允许你为现有类增加新功能,或者让它们之间兼容,而无需修改其源代码。适配器模式可以分为两类:

  • 类适配器模式:通过继承来适配一个类的接口。
  • 对象适配器模式:通过组合来适配一个类的接口。

适配器模式主要包含以下角色:

  • 目标接口Target):这是客户端所期望的接口,可以是一个类或一个接口。
  • 适配者Adaptee):这是需要适配的接口,即拥有不兼容接口的对象。
  • 适配器Adapter):这是关键部分,它 持有适配者对象的实例,并且可以 调用适配者的方法,同时 实现目标接口,从而使得适配者接口和目标接口兼容。

在这里插入图片描述

假设有一个类 AmericanPlug,其接口与我们的需求不兼容。我们希望使用这个类,但需要将其适配到我们所需的接口 ChinesePlug

// 目标接口
interface ChinesePlug {void connect();
}// 适配者
class AmericanPlug {public void plugIn() {System.out.println("American Plug is connected.");}
}// 适配器
class Adapter extends AmericanPlug implements ChinesePlug {@Overridepublic void connect() {super.plugIn();}
}public class AdapterPatternExample {public static void main(String[] args) {ChinesePlug plug = new Adapter();plug.connect(); // 输出 "American Plug is connected."}
}

在这个例子中,Adapter 类继承了 AmericanPlug 类并实现了 ChinesePlug 接口。通过这个适配器,客户端可以使用 ChinesePlug 接口,而实际上调用的是 AmericanPlug 类的方法。

适配器模式可以使得你复用现有的类,而不必修改它们的接口,同时增加了系统的灵活性和可扩展性。

2.装饰器模式(Decorator)

装饰器模式Decorator Pattern)是一种结构型设计模式,允许在运行时动态地为对象添加行为和职责,而不需要修改对象的结构。通过这种方式,可以 在不使用子类的情况下扩展对象的功能,提供了一种灵活的替代继承的方案。

2.1 主要特点

  • 动态扩展:可以在运行时动态地为对象添加功能,而不需要修改原有的类。
  • 透明性:装饰器类和被装饰的类具有相同的接口,客户端代码可以在不改变代码的情况下使用装饰后的对象。
  • 组合优于继承:避免了大量子类的产生,使代码更加灵活和可维护。

2.2 组成部分

  • Component组件):
    • 定义一个接口或抽象类,表示 被装饰的对象
    • 具体组件实现这个接口或抽象类。
  • ConcreteComponent具体组件):
    • 实现 Component 接口,提供基本的行为或功能。
  • Decorator装饰器):
    • 持有一个 Component 对象的引用。
    • 实现 Component 接口,可以在调用具体组件的方法前后添加新的行为。
  • ConcreteDecorator具体装饰器):
    • 继承自 Decorator,实现具体的装饰行为。

2.3 示例代码

以下是一个简单的 Java 示例,展示了如何使用装饰器模式为文本添加不同的格式。

2.3.1 Component 组件

// Component 组件
interface TextComponent {String getText();
}
  • TextComponent:定义了一个接口,声明了一个 getText 方法。这个接口表示 被装饰的对象 的基本行为。

2.3.2 ConcreteComponent 具体组件

// ConcreteComponent 具体组件
class SimpleText implements TextComponent {private String text;public SimpleText(String text) {this.text = text;}@Overridepublic String getText() {return text;}
}
  • SimpleText:实现了 TextComponent 接口,提供了一个具体的文本实现。
    • 属性text,存储具体的文本内容。
    • 构造方法SimpleText(String text),初始化文本内容。
    • 方法getText(),返回存储的文本内容。

2.3.3 Decorator 装饰器

// Decorator 装饰器
abstract class TextDecorator implements TextComponent {protected TextComponent component;public TextDecorator(TextComponent component) {this.component = component;}@Overridepublic String getText() {return component.getText();}
}
  • TextDecorator:抽象类,持有一个 TextComponent 对象的引用,实现了 TextComponent 接口。
    • 属性component,存储被装饰的组件。
    • 构造方法TextDecorator(TextComponent component),初始化 被装饰的组件
    • 方法getText(),调用被装饰组件的 getText 方法,返回其文本内容。这个方法在具体装饰器中可以被重写,以添加额外的行为

2.3.4 ConcreteDecorator 具体装饰器

// ConcreteDecorator 具体装饰器
class BoldTextDecorator extends TextDecorator {public BoldTextDecorator(TextComponent component) {super(component);}@Overridepublic String getText() {return "<b>" + super.getText() + "</b>";}
}class ItalicTextDecorator extends TextDecorator {public ItalicTextDecorator(TextComponent component) {super(component);}@Overridepublic String getText() {return "<i>" + super.getText() + "</i>";}
}
  • BoldTextDecorator具体的装饰器,继承自 TextDecorator,为文本添加粗体格式。
    • 方法getText(),在被装饰组件的文本内容前后添加 <b></b> 标签。
  • ItalicTextDecorator具体的装饰器,继承自 TextDecorator,为文本添加斜体格式。
    • 方法getText(),在被装饰组件的文本内容前后添加 <i></i> 标签。

2.3.5 客户端代码

// 客户端代码
public class DecoratorPatternExample {public static void main(String[] args) {// 创建一个简单的文本组件TextComponent simpleText = new SimpleText("Hello, World!");// 为简单文本添加粗体装饰TextComponent boldText = new BoldTextDecorator(simpleText);// 为粗体文本添加斜体装饰TextComponent italicBoldText = new ItalicTextDecorator(boldText);System.out.println(simpleText.getText()); // 输出原始文本: Hello, World!System.out.println(boldText.getText());   // 输出粗体文本: <b>Hello, World!</b>System.out.println(italicBoldText.getText()); // 输出斜体和粗体文本: <i><b>Hello, World!</b></i>}
}

2.4 总结

通过装饰器模式,可以在不修改原有类的情况下,动态地为对象添加新的功能。这种方式使得代码更加灵活和可扩展,避免了大量子类的产生。

  • 优点
    • 灵活性:可以在运行时动态地添加或删除功能。
    • 可扩展性:通过组合不同的装饰器,可以轻松地创建复杂的对象。
    • 代码复用:避免了大量子类的产生,减少了代码的复杂性。
  • 缺点
    • 复杂性:过多的装饰器可能会使代码变得复杂,难以维护。
    • 性能:每次调用方法时都需要额外的处理,可能会有性能开销。

装饰器模式在许多框架和库中都有应用,例如 Java I/O 流中的 BufferedInputStreamDataInputStream,以及 Spring 框架中的 AOP(面向切面编程)。

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

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

相关文章

认识物联网

新一代信息技术 物联网 物物相连的互联网&#xff0c;即物联网&#xff0c;又称传感器常见的传感器 • 温度传感器 • 压力传感器 • 声音传感器 • 02 • */08521 物联网概念 • 通过射频识别&#xff0c;红外传感器&#xff0c;全球定位系统GPS&#xff0c;激光扫描…

C语言 | Leetcode 题解之第535题TinyURL的加密与解密

题目&#xff1a; 题解&#xff1a; typedef struct {int key;char *val;UT_hash_handle hh; } HashItem;HashItem *dataBase NULL;char* encode(char* longUrl) {srand(time(0));int key;HashItem * pEntry NULL;while (true) {key rand();pEntry NULL;HASH_FIND_INT(dat…

Linux:线程安全的单例模式

设计模式 设计模式听上去是个很高贵的名词&#xff0c;其实就是是一套 多数人知晓、被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;简称&#xff1a;对于编程比较典的场景的解决方案 单例模式 单例模式就是其中一种设计模式&#xff0c;是设计模式里的创建型模…

【网络安全】揭示 Web 缓存污染与欺骗漏洞

未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…

AI打造超写实虚拟人物:是科技奇迹还是伦理挑战?

内容概要 在这个科技飞速发展的时代&#xff0c;超写实虚拟人物仿佛从科幻小说中走进了我们的日常生活。它们以生动的形象和细腻的动作&#xff0c;不仅在影视、广告和游戏中吸引了无数目光&#xff0c;更让我们对AI技术的未来充满了期待和疑惑。这些数字化身在逼真的外貌下&a…

第三次RHCSA作业

1、配置网络&#xff1a;为网卡添加一个本网段IPV4地址&#xff0c;x.x.x.123 2、配置yum本地仓库&#xff0c;并完成traceroute命令的安装 yum库配置成功过后&#xff0c;显示这个报错&#xff0c;没能写完 3、用至少两种方法查看sshd服务的进程号 4、添加一块10G大小的磁盘&…

前端用docker部署

1、环境检查 首先需要确认服务器上是否已经安装docker了。 在服务器上执行docker -v 显示对应的版本号说明已经安装好了docker 2、部署 使用Docker部署若依项目的前端服务&#xff0c;我们最终实现的是&#xff1a;启动一个镜像&#xff0c;我们的整个前端就启动了&#xf…

论文翻译:ICLR 2024.DETECTING PRETRAINING DATA FROM LARGE LANGUAGE MODELS

文章目录 检测大型语言模型的预训练数据摘要1 引言2 预训练数据检测问题2.1 问题定义和挑战2.2 WIKIMIA&#xff1a;动态评估基准 3 MIN-K% PROB&#xff1a;简单的无参考预训练数据检测方法4 实验4.1 数据集和指标4.2 基线检测方法4.3 实现和结果4.4 分析 5 案例研究&#xff…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

根据关键字搜索商品API返回值解析:深入解析与代码实践

在电子商务和数据集成领域&#xff0c;API&#xff08;应用程序编程接口&#xff09;扮演着至关重要的角色。通过API&#xff0c;开发者可以访问和利用平台的数据资源&#xff0c;实现自动化和智能化的数据交互。本文将探讨如何根据关键字搜索商品API的返回值进行解析&#xff…

哈尔滨华时信息技术有限公司,特色之处见怎么样

哈尔滨华时信息技术有限公司的特色之处体现在以下几个方面&#xff1a; 1. **技术优势**&#xff1a; - **无线网络技术专长**&#xff1a;在无线网络领域有深厚的技术积累和优势。具备高度的灵活性与移动性&#xff0c;能为客户提供灵活的网络解决方案&#xff0c;满足如移动…

【书生.浦语实战营】——入门岛

【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch &#xff1a;创建文件mkdir &#xff1a;创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…

KubeVirt 安装和配置 Windows虚拟机

本文将将介绍如何安装 KubeVirt 和使用 KubeVirt 配置 Windows 虚拟机。 前置条件 准备 Ubuntu 操作系统&#xff0c;一定要安装图形化界面。 安装 Docker&#xff08;最新版本&#xff09; 安装 libvirt 和 TigerVNC&#xff1a; apt install libvirt-daemon-system libvir…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…

智慧城市的守护者——智能井盖监测终端

城市化进程的加速推进使得基础设施建设成为提升城市品质的关键环节。然而&#xff0c;在这一进程中&#xff0c;市政公用设施中的井盖与地下线缆的安全问题却日益凸显。由于缺乏有效的实时监控与管理体系&#xff0c;给犯罪分子留下了可趁之机&#xff0c;频繁发生的井盖被盗及…

零基础玩转IPC之——如何实现远程实时查看监控视频(P2P)

P2P是peer-to-peer的简称&#xff0c;又称为点对点技术&#xff0c;是没有中心服务器、依靠用户群节点进行信息交换的对等式网络。区别于传统的C/S中央服务器结构&#xff0c;P2P网络中每一个用户节点即是客户端又是服务端&#xff0c;能同时作为服务器给其他节点提供服务。 优…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业&#xff0c;每天需要处理大量纸质文件&#xff0c;从合同到判决书&#xff0c;手动录入不仅费时&#xff0c;还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台&#xff0c;通过先进的光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;将…

华为OD七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、滑动窗口第5天、贪心算法第6天、二分查找第7天、分治递归 六、集训总结 大家好&#xff0c;我是哪吒。 最…

【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)

KTV、棋牌室、音乐厅等休闲服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市休闲服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、各区县…