设计模式—适配器模式

概念:

适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

本章代码: 小麻雀icknn/设计模式练习 - Gitee.com

结构:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者

UML类图:

 例: 

 目标(Target)接口: 

package com.study.main.Adapter;public interface Usb {String useUsbMethod();
}

 适配器(Adapter)类: 

package com.study.main.Adapter;public class ChangeAdapter implements Usb{AndroidTypeC androidTypeC;public ChangeAdapter() {this.androidTypeC = new AndroidTypeC();}@Overridepublic String useUsbMethod() {return androidTypeC.myUsbMethods();}
}

适配者(Adaptee)类: 

package com.study.main.Adapter;public class AndroidTypeC {String myUsbMethods(){return "Android TypeC 接口";}
}
package com.study.main.Adapter;public class Android implements Usb{@Overridepublic String useUsbMethod() {return "Android USB 适配 Mini-USB";}
}

运行&结果: 

场景分析 :

适配器模式一般常用的使用场景有:

  • 原有接口无法修改时;
  • 原有接口功能太老旧时;
  • 统一多个类的接口设计时;
  • 需要过渡升级旧接口时;
  • 需要依赖外部系统时;
  • 适配不同数据格式时;
  • 不同接口协议转换时。

适配器模式的使用场景主要有这两大类:第一类就是原有接口功能不满足现有要求,需要在兼容老接口的同时做适当的扩展;第二类是有相似性的多个不同接口之间做功能的统一

适配器在源码中的应用 : 

在inputStreamReader中适配了inpuStream类并使用了里面的方法把InputStream对象转换成了BufferReader

适配器模式优缺点:

优点:

  • 将目标类和具体适配者类解耦。 通过引入一个适配器类来兼容现有的目标类,重用原有类功能的同时扩展新功能,而无须修改原有目标类代码,这样很好地避免了具体适配者类和目标类的直接耦合。
  • 增加了类的透明性。 具体的适配者类中新增功能只影响适配者类,而对于使用目标类的客户端类来说是透明的(使用目标类接口),客户端的调用逻辑不会受到影响。
  • 满足里氏替换原则 具体适配者类通过适配器类与目标类进行交互,那么适配器类只要不影响目标类的接口功能,具体适配者类无论使用什么样的新功能,都能很方便快速地进行替换。
  • 符合开闭原则 由于具体适配者类要么是适配器类的子类,要么和适配器类是组合关系,所以对目标类没有修改,满足开闭原则。
  • 统一多个类或接口 一个适配器类可以把多个不同的具体适配者类和子类,都适配到同一个目标类上,如果这个目标类是一个新类,那么就是间接实现了统一多个类或接口的功能。

缺点:

  • 一次只能适配一个抽象类或接口
    像 Java、C# 等编程语言是不支持多重继承的,那么在进行适配时,一次最多只能适配一个适配者类。另外,目标类只能为抽象类或接口,不能为具体实例类,这样会在适配时增加很多类文件和代码量,如果适配的类或接口比较多,那么就会增加代码的理解难度。
  • 过度嵌套会导致接口臃肿 适配器有一个最大的弊端就是,一旦不停地在同一个目标类上增加适配器,就会很容易让接口变得越来越臃肿。你见过一个接口被适配 20 次的情景吗?我前不久在工作中就见过,其实这也是开闭原则极端副作用的某种体现。因为不想去修改原有接口,所以就不断使用新接口适配,而维护接口的人又在不断变化,于是就继续按照这个不修改的思路维护下去,表面上的确符合开闭原则,但实际上只不过是将风险不断隐藏罢了。一旦原始接口(目标类)功能下线后,这个适配链条造成的影响会非常大。
  • 目标接口依赖太多适配接口,修改目标接口会导致所有适配接口都需要定制修改。 本来适配器模式是为了解耦,但是如果适配太多接口,就会演变为另一种定制化的开发。比如,上游平台商家提供的接口变更,导致下游使用方频繁变更接口。再比如,消息组件接口的变更导致所有引用消息组件的适配器全部都需要修改。

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

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

相关文章

开源的前端思维导图库介绍

在开源社区中,有许多优秀的思维导图库可供开发者使用。这些库通常具有丰富的功能和灵活的API,可以满足不同需求的前端开发。以下是一些流行的开源前端思维导图库,以及它们的特点和区别。 1. **MindMap** 特点: - 基于原生…

【数据结构】二、线性表:4.循环链表的定义及其基本操作(循环单链表,循环双链表的初始化、判空、判断头结点、尾结点、插入、删除)

文章目录 4.循环链表4.1循环单链表4.1.1初始化4.1.2判断单链表是否为空4.1.3判断p结点是否为循环单链表的表尾结点 4.2循环双链表4.2.1初始化4.2.2判断循环链表是否为空4.2.3判断结点p是否为循环双链表的表尾结点4.2.4双链表的插入4.2.5双链表的删除 4.循环链表 4.1循环单链表…

十堰网站建设公司华想科技具有10年的网站制作经验

2018年已经结束了。 华翔科技收到了很多客户的咨询,他们都有一个共同的问题:建一个网站需要多少钱? 但是,我们都会问:您有什么具体需求吗? 大多数人的答案是否定的,他们只是想打听一下价格。 十…

《JAVA与模式》之模板方法模式

系列文章目录 文章目录 系列文章目录前言一、模板方法模式的结构二、模板方法模式中的方法三、使用场景四、模板方法模式在Servlet中的应用前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了…

【MySQL 系列】MySQL 起步篇

MySQL 是一个开放源代码的、免费的关系型数据库管理系统。在 Web 开发领域,MySQL 是最流行、使用最广泛的关系数据库。MySql 分为社区版和商业版,社区版完全免费,并且几乎能满足全部的使用场景。由于 MySQL 是开源的,我们还可以根…

基于springboot的大学生智能消费记账系统的设计与实现(程序+数据库+文档)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符,用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性,它是唯一具有此能力的C风格的转型操作符。在C11中,const_cast可以完成…

HarmonyOS—配置编译构建信息

在进行应用/服务的编译构建前,需要对工程和编译构建的Module进行设置。API Version 9、API Version 8与API Version 4~7的构建体系不同,因此在设置编译构建信息时也存在差异: API Version 9:需要对构建配置文件、构建脚本、应用依…

中医舌苔笔记

目录 一.不适合舌诊的情况吃了有色东西的食物不要看舌象,晨起不要看舌象尽量不要在饭后半小时内看舌象尽量不要在有色灯光下看舌象吃了某些抗生素、某些化学添加剂后不要看舌象。月经期不要看舌象 二.舌诊顺序三.舌诊脏腑部位分属图四.看舌是看什么?舌体…

世界的本质是旋转(5)-在复平面上驱动软件无线电SDR发射BPSK波形

在上一篇文章中,我们介绍了复平面、拍照采样的一些思维实验。从本节开始,转入现实应用,通过控制复平面向量的位置,实现一个完整的BPSK全双工通信通道。 发射方:通过控制复平面向量在各个时刻的位置来携带信息的技术&a…

qml 怎么将ChartView 的 background 图层的边距设置为 0

qml的ChartView有个background图层,background图层默认是有边距的,而且这个边距是没有属性与方法可以修改的,假如我要创建两个ChartView,让他们纵向紧挨着,实际结果如图: 代码如下: ColumnLayout {id: mainColumnanchors.fill: parentanchors.leftMargin: 10spacing: 0…

网络原理初识

一、IP地址 概念 IP 地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说, IP 地址用于定位主机 的网络地址 。 就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。 二、…

k8s-生产级的k8s高可用(1) 24

高可用集群 实验至少需要三个master(控制节点),一个可以使外部可以访问到master的load balancer(负载均衡)以及一个或多个外部节点worker(也要部署高可用)。 再克隆三台主机 清理并重启 配置两…

C++惯用法之RAII思想: 资源管理

C编程技巧专栏:http://t.csdnimg.cn/eolY7 相关系列文章 C智能指针的自定义销毁器(销毁策略) 目录 1.概述 2.RAII的应用 2.1.智能指针 2.2.文件句柄管理 2.3.互斥锁 3.注意事项 3.1.禁止复制 3.2.对底层资源使用引用计数法 3.3.复制底部资源(深拷贝)或者转移…

2024新版微信小程序登录注册功能的实现,授权登录,退出,缓存讲解,小程序个人中心的实现,修改头像 图片上传功能的实现 新版登陆注册,头像上传,修改昵称

新版小程序授权登录注册获取头像昵称文档 一,无法获取用户的微信头像和昵称 最近好多同学在学习石头哥小程序课程的时候,遇到了下面这样的问题,在小程序授权获取用户头像和昵称时,获取到的是下面这样的。 到底是什么原因导致的…

YOLO v1讲解

YOLO是最经典的一阶目标检测框架,记录一下v1思路。 整体流程 输入数据一张 448 448 3 448 \times 448 \times 3 4484483 的图片,切分成 7 7 7 \times 7 77 的网格将图片经过多层CNN,下采样得到 7 7 30 7 \times 7 \times 30 7730 的f…

代码随想录算法训练营第day9|28. 找出字符串中第一个匹配项的下标、459.重复的子字符串

a.28. 找出字符串中第一个匹配项的下标 题目链接 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示…

关于JVM的小总结(待补充)

JVM组成及他们之间的关系 装载类子系统字节码执行引擎运行时数据区 装载类子系统 类加载器字节码调节器类加载运行时数据区 字节码执行引擎 运行时数据区 线程私有 虚拟机栈本地方法栈程序计数器 线程共享 堆方法区(元空间)

Vue3 中的代理原理详解

Vue3 中的代理原理详解 Vue3 中引入了代理(Proxy)机制,取代了 Vue2 中的 Object.defineProperty() 机制,用于实现数据响应式。代理机制是 ES6 中新增的特性,它可以用来自定义对象中的操作,比如属性查找、赋…

rabbitmq总结

一、初次感知 https://www.cnblogs.com/zqyx/p/13170881.html 这篇文章非常好,讲了一些持久化的原理。 1. 第一次使用rabbitmq发信息 // 创建连接工厂ConnectionFactory connectionFactorynew ConnectionFactory();connectionFactory.setHost("192.168.88.1…