【地铁上的设计模式】--结构型模式:适配器模式
前面几篇文章我们学习了创建型模式,从本篇文章开始,我们将学习结构型模式。
什么是结构型模式
结构型模式是一种设计模式,它描述了如何将类或对象结合在一起形成更大的结构,以提供新的功能或实现更复杂的行为。结构型模式包括以下几种:
- 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一种接口,从而让原本因接口不兼容而不能一起工作的类能够一起工作。
- 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
- 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能而言,装饰器模式比生成子类更为灵活。
- 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,使得子系统更加容易使用。
- 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。
- 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。
这些结构型模式都是为了解决不同的设计问题而产生的,具有一定的适用范围和场景。在实际开发中,我们可以根据具体的需求来选择使用哪种结构型模式,以达到最优的设计效果。
首先,我们来学习一下适配器模式
什么是适配器模式
适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。在现实生活中,适配器是一个常见的概念,比如我们去旅游时需要一个转换器适配器将电器从国内电压适配到国外电压。
在软件开发中,适配器模式也是经常用到的。它可以帮助我们在不修改已有代码的情况下,实现不同类之间的互相适配,从而提高代码的复用性和可维护性。
适配器模式包含三个角色:目标接口、适配器和被适配者。目标接口是客户端所期望的接口,适配器实现了目标接口,并持有被适配者的引用,通过调用被适配者的接口实现目标接口。被适配者是原本存在的类,但是其接口与目标接口不兼容。
适配器模式有两种实现方式:类适配器和对象适配器。类适配器通过继承被适配者类和实现目标接口,来实现适配器。对象适配器则通过持有被适配者的引用,在适配器中实现目标接口来实现适配器。
适配器模式的优点在于可以将不兼容的接口进行适配,使得现有代码得到复用,而不需要改变现有代码。同时,适配器模式也可以降低类之间的耦合度,提高代码的灵活性和可维护性。
适配器模式也有一些缺点。首先,适配器会增加系统的复杂性,增加代码的数量和维护成本。其次,适配器模式不适合在设计初期使用,而应该是在已有代码需要进行接口调整时使用。
总的来说,适配器模式是一种实用性很强的设计模式,可以帮助我们在不修改已有代码的情况下实现接口的适配,提高代码的复用性和可维护性。
如何实现适配器模式
实现适配器模式的一般步骤如下:
- 定义目标接口:即需要适配的接口,也就是系统需要使用的接口。
- 定义适配器:实现目标接口,并持有适配者对象的引用。
- 定义适配者:即需要被适配的对象,其原本的接口与系统需要使用的接口不兼容。
- 在适配器中实现目标接口方法:在适配器中将目标接口方法的调用转换为对适配者的调用,以达到适配的目的。
- 在客户端中使用适配器:将适配器对象传递给客户端,由客户端调用目标接口方法。
具体实现步骤可能会因为编程语言和实际应用场景而有所不同,但以上是适配器模式的一般实现步骤。
Java实现
下面是Java实现适配器模式的示例代码:
首先,定义一个目标接口(Target):
public interface Target {void request();
}
然后,定义一个需要适配的类(Adaptee):
public class Adaptee {public void specificRequest() {System.out.println("Adaptee specific request");}
}
接下来,实现一个适配器(Adapter),让它实现目标接口(Target):
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}
}
适配器(Adapter)类持有一个需要适配的对象(Adaptee)的引用,在实现目标接口的方法时,通过调用该对象的特定方法实现适配。
最后,使用适配器模式将需要适配的类(Adaptee)适配到目标接口(Target)上:
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}
在客户端代码中,实例化需要适配的类(Adaptee),然后将其通过适配器(Adapter)适配到目标接口(Target)上,实现了对需要适配的类的调用。以上就是适配器模式在Java中的实现步骤和示例代码。
C#实现
在 C# 中,适配器模式的实现与 Java 类似。下面是一个简单的示例:
// 目标接口
public interface ITarget {void Request();
}// 适配者接口
public class Adaptee {public void SpecificRequest() {Console.WriteLine("Adaptee.SpecificRequest() called.");}
}// 类适配器
public class Adapter : Adaptee, ITarget {public void Request() {SpecificRequest();}
}// 对象适配器
public class ObjectAdapter : ITarget {private Adaptee _adaptee;public ObjectAdapter(Adaptee adaptee) {_adaptee = adaptee;}public void Request() {_adaptee.SpecificRequest();}
}// 客户端代码
static void Main(string[] args) {// 类适配器ITarget target1 = new Adapter();target1.Request();// 对象适配器Adaptee adaptee = new Adaptee();ITarget target2 = new ObjectAdapter(adaptee);target2.Request();
}
在类适配器中,适配器类继承了适配者类,并实现了目标接口。在对象适配器中,适配器类将适配者对象作为其成员,并实现了目标接口。两种实现方式的结果是相同的,都可以将适配者的接口转换成目标接口,从而使得客户端可以通过目标接口调用适配者的方法。
需要注意的是,在 C# 中,接口和抽象类都可以作为适配器的目标接口。由于 C# 不支持多重继承,因此无法像 Java 一样通过继承多个接口来实现适配器模式。但是,C# 支持接口的默认实现,这使得我们可以实现一个默认适配器类,用来适配目标接口的默认行为。
总结
适配器模式通过包装一个不兼容的对象,将其转换为与另一个对象兼容的形式。它提供了一种将新代码与现有代码集成的方法,同时也可以减少代码的重复。在实际应用中,适配器模式可以用于集成不同的系统和组件,使它们能够无缝地协同工作。它的缺点是增加了代码的复杂性,因为需要额外的适配器类来进行转换。在设计时需要考虑到接口的扩展和变化,以免影响适配器的使用。适配器模式在实际的软件开发中非常有用,特别是在集成不同的系统或组件时。
相关文章:
【地铁上的设计模式】--结构型模式:适配器模式
前面几篇文章我们学习了创建型模式,从本篇文章开始,我们将学习结构型模式。 什么是结构型模式 结构型模式是一种设计模式,它描述了如何将类或对象结合在一起形成更大的结构,以提供新的功能或实现更复杂的行为。结构型模式包括以…...

重大剧透:你不用ChatGPT,它砸你饭碗
早晨看到路透社报道,盖茨说,与其争论技术的未来,不如专注于如何更好地利用人工智能。 这可能是他对马斯克他们呼吁暂停AI研发6个月的一种回应吧。 有种古语说:天下大势,浩浩汤汤,顺之者昌,逆之者…...
状态机模式
状态模式 状态模式定义:使用场景角色定义1. State一抽象状态角色2. ConcreteState一-具体状态角色3. Context--环境角色 需求背景1. 订单状态抽象类2. 定义订单具体状态类并集成基类(抽象类)2.1 订单创建状态2.2 订单已支付状态2.3 订单已发货状态2.4 订…...

瑞吉外卖:后台系统登录功能
文章目录 需求分析代码开发创建实体类导入返回结果类Rcontroller、service与mapperlogin.html 需求分析 点击登录按钮后,浏览器以POST方式向employee/login提交username和password,服务器经过处理后向浏览器返回某种格式的数据,其中包含&…...

Linux拓展:链接库
一.说明 本篇博客介绍Linux操作系统下的链接库相关知识,由于相关概念已在Windows下链接库一文中介绍,本篇博客直接上操作。 二.静态链接库的创建和使用 1.提前看 这里主要介绍的是C语言的链接库技术,而在Linux下实现C语言程序,…...

基于.Net开发的、支持多平台、多语言餐厅点餐系统
今天给大家推荐一套支持多平台、多语言版本的订单系统,适合餐厅、酒店等场景。 项目简介 这是基于.Net Framework开发的,支持手机、平板、PC等平台、多语言版本开源的点餐系统,非常适合餐厅、便利店、超市、酒店等,该系统基础功…...
Windows系统SSL/TLS安全协议介绍
支持安全加密的https底层使用的就是SSL/TLS,在发起https请求之前需要先建立TCP连接,之后再进行SSL/TLS协议协商,协商通过后才能发起https请求。本文将详细介绍SSL/TLS协议相关的内容。 之前在项目中就出现过客户端SSL/TLS版本过低,导致向服务器发起连接时被服务器拒绝的问题…...

ovs-vsctl 命令详解
ovs-vsctl 命令详解 网桥Bridge 创建 Bridge ovs-vsctl add-br br0 删除 Bridge ovs-vsctl del-br br0 列出 Bridge ovs-vsctl list-br 显示详情 ovs-vsctl show 端口 Port 添加端口 ovs-vsctl add-port br0 p1 其中br0 为上面添加的bridge p1可以是物理端口或者vN…...
具备“记忆”功能的VBA目录选择器
大家使用任意一款浏览器(例如:Chrome、Edge)下载文件时,如果【另存为】对话框选择C:\Download,那么下次再次使用【另存为】功能,对话框默认显示C:\Download,而不是根目录。 在VBA开发中调用目录…...

electron入门 | 手把手带electron项目初始化
Electron是一个基于Chromium和 Node.js,可以使用 HTML、CSS和JavaScript构建跨平台应用的技术框架,兼容 Mac、Windows 和 Linux。 目录 1.了解electron 2.开发环境 3.初始化 采坑插曲: 1.了解electron Electron 可以让你使用纯 JavaScrip…...
力扣解法汇总2423. 删除字符使频率相同
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你…...

【超算/先进计算学习】日报8
目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记阶段一阶段二阶段三阶段四 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 超算/高性能计算总结 遇到的问题及解决方案 无 任务完成详细笔记 阶段一 在学习的第一阶段,我们首先对需要…...

《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World
目录 听说世界是由多个Level组成的 1.2.1 引言 1.2.2 建造大陆(ULevel) 1.2.3构建世界(World) 1.2.4总结 听说世界是由多个Level组成的 1.2.1 引言 上小节谈到Actor和Component的关系,UE利用Actor的概念组成了世…...

IDEA部署tomcat项目
文章目录 只是部署一下看到这里即可war和war exploded的区别warwar exploded update的动作update resourcesupdate classes and resourcesredeployrestart server 解决了拿到了一个tomcat项目后如何将它部署到IDEA里面的问题。 file->open 选中pom.xml并open as project …...
IAM角色
Identity-based policy,它关联到特定的User/Role/Group上,指定这些主体能对哪些资源进行怎样的操作 Resource-based policy,它关联到具体的AWS资源上,指定哪些主体可以对这个资源做怎样的操作 aws受信任关系视为aws服务可以实现&a…...

【VAR | 时间序列】以美国 GDP 和通货膨胀数据为例的VAR模型简单实战(含Python源代码)
以美国 GDP 和通货膨胀数据为例: 1. 数据集 下载数据我们需要从 FRED 数据库下载美国 GDP 和通货膨胀数据,并将它们存储在 CSV 文件中。可以在 FRED 网站(https://fred.stlouisfed.org/)搜索并下载需要的数据。在这里࿰…...
常用的设计模式之二(行为型模式)
文章目录 观察者模式模板模式 观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并进行相应的处理。 观察者…...

MYSQL基本操作(增删改查)
数据库的列类型 int:整型 用于定义整数类型的数据 float:单精度浮点4字节32位 准确表示到小数点后六位 double:双精度浮点8字节64位 char:固定长度的字符类 用于定义字符类型数据&…...

双周赛103(模拟、网格图BFS、树状数组)
文章目录 双周赛103[6406. K 个元素的最大和](https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/)模拟 [6405. 找到两个数组的前缀公共数组](https://leetcode.cn/problems/find-the-prefix-common-array-of-two-arrays/)模拟 [6403. 网格图中鱼的最大数目](…...

【数据结构】二叉树(详细)
二叉树 1.树1.1定义1.2基本术语1.3树形结构和线性结构1.4树的存储结构1.4.1双亲表示法1.4.2孩子兄弟表示法 2.二叉树2.1定义2.2特殊二叉树2.3性质2.4存储结构2.4.1顺序存储2.4.2链式存储结构 3.二叉树的基本操作3.1前序遍历(先序遍历)3.2中序遍历3.3后序…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...