当前位置: 首页 > news >正文

【地铁上的设计模式】--结构型模式:适配器模式

前面几篇文章我们学习了创建型模式,从本篇文章开始,我们将学习结构型模式。

什么是结构型模式

结构型模式是一种设计模式,它描述了如何将类或对象结合在一起形成更大的结构,以提供新的功能或实现更复杂的行为。结构型模式包括以下几种:

  1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一种接口,从而让原本因接口不兼容而不能一起工作的类能够一起工作。
  2. 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  3. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
  4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能而言,装饰器模式比生成子类更为灵活。
  5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,使得子系统更加容易使用。
  6. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。
  7. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。

这些结构型模式都是为了解决不同的设计问题而产生的,具有一定的适用范围和场景。在实际开发中,我们可以根据具体的需求来选择使用哪种结构型模式,以达到最优的设计效果。
首先,我们来学习一下适配器模式

什么是适配器模式

适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。在现实生活中,适配器是一个常见的概念,比如我们去旅游时需要一个转换器适配器将电器从国内电压适配到国外电压。
在软件开发中,适配器模式也是经常用到的。它可以帮助我们在不修改已有代码的情况下,实现不同类之间的互相适配,从而提高代码的复用性和可维护性。
适配器模式包含三个角色:目标接口、适配器和被适配者。目标接口是客户端所期望的接口,适配器实现了目标接口,并持有被适配者的引用,通过调用被适配者的接口实现目标接口。被适配者是原本存在的类,但是其接口与目标接口不兼容。
适配器模式有两种实现方式:类适配器和对象适配器。类适配器通过继承被适配者类和实现目标接口,来实现适配器。对象适配器则通过持有被适配者的引用,在适配器中实现目标接口来实现适配器。
适配器模式的优点在于可以将不兼容的接口进行适配,使得现有代码得到复用,而不需要改变现有代码。同时,适配器模式也可以降低类之间的耦合度,提高代码的灵活性和可维护性。
适配器模式也有一些缺点。首先,适配器会增加系统的复杂性,增加代码的数量和维护成本。其次,适配器模式不适合在设计初期使用,而应该是在已有代码需要进行接口调整时使用。
总的来说,适配器模式是一种实用性很强的设计模式,可以帮助我们在不修改已有代码的情况下实现接口的适配,提高代码的复用性和可维护性。

如何实现适配器模式

实现适配器模式的一般步骤如下:

  1. 定义目标接口:即需要适配的接口,也就是系统需要使用的接口。
  2. 定义适配器:实现目标接口,并持有适配者对象的引用。
  3. 定义适配者:即需要被适配的对象,其原本的接口与系统需要使用的接口不兼容。
  4. 在适配器中实现目标接口方法:在适配器中将目标接口方法的调用转换为对适配者的调用,以达到适配的目的。
  5. 在客户端中使用适配器:将适配器对象传递给客户端,由客户端调用目标接口方法。

具体实现步骤可能会因为编程语言和实际应用场景而有所不同,但以上是适配器模式的一般实现步骤。
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语言程序&#xff0c…...

基于.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/)搜索并下载需要的数据。在这里&#xff0…...

常用的设计模式之二(行为型模式)

文章目录 观察者模式模板模式 观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并进行相应的处理。 观察者…...

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后序…...

蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐

随着科技的进步,蓝牙耳机已然成为我们生活中的一部分,无论是通勤、追剧、运动或者玩游戏,大都会用到蓝牙耳机。那么,哪款蓝牙耳机的性价比高一些?相信大多数人在选择产品的时候,都会看性价比。接下来&#…...

等保2.0存在的问题

等保制度和技术要求 国家信息安全等级保护制度(二级)相关要求包含技术要求和管理要求,技术要求包含:物理安全、网络安全、主机安全、应用安全及数据安全及备份恢复;管理要求包含:安全管理机构、安全管理制度、人员安全管理、系统建设管理、系统运维管理。 一、 技术要求 …...

国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作

IAP升级 Bootloader的制作 1、上节提到Flash的分区,0x8000000-0x8004000为Boot分区,我们的bootloader就烧录到此分区。 Bootloader很简单,新建一个普通的工程, 也不用初始化外部设备,开机后,直接跳转到 A…...

如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了

当我们在开发 JavaScript 项目时,会引入各种依赖库。但是有些依赖库可能只用到了部分功能,或者已经不再需要了,但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间,增加项目的复杂度,影响项目的性能。为…...

使用Python和机器学习进行文本情感分类

使用Python和机器学习进行文本情感分类 1. 效果图2. 原理3. 源码参考这篇博客将介绍如何使用Python进行机器学习的文本情感分类(Text Emotions Classification)。 1. 效果图 训练文本及情感分类前5条数据如下: 训练过程及测试文本情感分类效果图如下: 可以看到 对文本“S…...

QML路径视图(The PathView)

路径视图(PathView)非常强大,但也非常复杂,这个视图由QtQuick提供。它创建了一个可以让子项沿着任意路径移动的视图。沿着相同的路径,使用缩放(scale),透明(opacity&…...

5月4号软件资讯更新合集.....

🚀 Layui 2.8.2 发布 更新日志 table 修复 autoSort: true 时,更改 table.cache 未同步到 data 属性的问题 修复 多级表头存在 hide 表头属性时,执行完整重载可能出现的错位问题 修复 未开启 page 属性时底边框缺失问题 优化 打印内容中…...

基于 Rainbond 的混合云管理解决方案

内容概要:文章探讨了混合云场景中的难点、要点,以及Rainbond平台在跨云平台的混合云管理方面的解决方案。包括通过通过统一控制台对多集群中的容器进行编排和管理,实现了对混合云中应用的一致性管理。文章还介绍了Rainbond平台在混合云环境下…...

加强网络风险生命周期

当今业务环境中云原生应用程序的激增帮助组织简化了运营。 企业现在可以近乎实时地监控数据、与客户互动并分享见解,帮助他们克服曾经阻碍生产力的低效率问题。 然而,使用云也极大地扩展了企业可利用的攻击面。 CSPM、CWPP、CNAPP、SAST、SCA、IaC、D…...

Java——二叉树的深度

题目链接 牛客网在线oj题——二叉树的深度 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。 数据范围&am…...

如何承接网站建设外包/爱情链接

文章目录如何制作GIF?网页版GIF工具PC端GIF工具手机端GIF工具GIF压缩工具GIF现在被用得十分广泛了,各种表情包、小动画、甚至有些小教学说明动图也是GIF做的。在现在这个信息爆炸的年代,GIF已不再神秘,很多工具都可以制作GIF了,如…...

手机可以做网站服务器吗/2022最新热点事件及点评

前言:想成为Web前端工程师这三件法宝少不了 HTML、CSS和JavaScrip,工作中我们能够运用它们完成大多数任务。一位好的Web前端开发工程师在知识体系上不仅要有广度还要有深度,前端基础是重中之中! 带你高效率入门前端 一、 HTML&a…...

福州专业网站建设网络公司/百度应用商店官网

在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性1.隐式类型(1)源起在隐式类型出现之前,我们在声明一个变量的时候,总是要为一个变量指定他的类型甚至在foreach一个集合的时候,也要为遍历的集合的元素&#x…...

网站靠什么挣钱/seo网络优化日常工作内容

继续做首页的相关内容,并和小组成员一起优化了其布局,在视频首页加了滚动展示图片,遇到问题不少,但大致解决。明天准备继续完成其他功能。转载于:https://www.cnblogs.com/qq1793033075/p/10934374.html...

js网站登录怎么做/qq群推广网站

Description 给你一个无向图&#xff0c;N(N<500)个顶点, M(M<5000)条边&#xff0c;每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T&#xff0c;求一条路径&#xff0c;使得路径上最大边和最小边的比值最小。如果S和T之间没有路径&#xff0c;输出”IMPOSSIBLE”&a…...

网站开发需求分析word/免费网站友情链接

之前已经写过一篇关于Lucene安装学习的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5981292.html 上面两篇比较偏实践和应用&#xff0c;开了个头&#xff1b;这一篇是…...