设计模式学习笔记之适配器模式

本贴最后更新于 2160 天前,其中的信息可能已经时移世改

前言

这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。

如果有人看到我写的笔记有不对的地方欢迎留言指出来,是真的欢迎指出来,因为我可能会错很久,然后才发现。学习技术不能闭门造车,要多交流,多讨论,多思考才能成长的快,学的快。

我的个人博客:海加尔金鹰

什么是适配器模式

适配器模式的定义

适配器模式有时也称包装器模式,指的是将一个类的接口转换成我们需要的接口。根据不同的实现方式适配器可以分为三种:继承类的叫类适配器,持有类的叫对象适配器,实现接口的叫接口适配器。

适配器模式适用场景

  1. 系统需要使用现有的类,但现有的类却不兼容。
  2. 需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类.
  3. 需要一个统一的输出接口,但是输入类型却不可预知1

适配器模式的结构

  1. 目标接口(Target):调用方所期待得到的接口。
  2. 适配器(Adaper):核心角色,适配器把源接口转换成目标接口。
  3. 被适配者(Adaptee):即真正的接口,需要通过适配器进行调用。

类适配器

被适配者(Adaptee)

public class HQB { //源接口,不符合目前的需求需要进行适配修改。 public String show(String msg){ return "霍去病:"+msg; } }

目标接口(Target)

public interface HQUBService { //客户端希望得到的新的接口 String newShow(String name,String msg); }

适配器(Adaper)

public class HQBAdapter extends HQB implements HQUBService { @Override public String newShow(String name,String msg) { //这是原来的接口 String old = show(msg); System.out.println(old); //新接口需要在原来的接口上进行部分修改 String replace = old.replace("霍去病", name); return replace; } }

对象适配器

在上述代码基础上新增一个适配器

public class HQBAdapter2 { //将被适配者当成属性持有 private HQB hqb; //通过构造器方式注入 不一定使用这种方式,但一定要保证被适配者不为NULL,不然怎么进行适配 public HQBAdapter2(HQB hqb){ this.hqb=hqb; } public void newShow(String name,String msg){ //原来的处理方式 String show = hqb.show(msg); System.out.println(show); //新处理方式 System.out.println(show.replace("霍去病",name)); } }

类适配器和对象适配器的调用方式和结果

调用方式:

public class HQBTest { public static void main(String[] args) { //类适配器 String newShow = new HQBAdapter().newShow("两分刘", "真的短"); System.out.println(newShow); //对象适配器 new HQBAdapter2(new HQB()).newShow("乔碧螺陛下","榜一"); } }

结果:

霍去病:真的短 两分刘:真的短 霍去病:榜一 乔碧螺陛下:榜一

类适配器和对象适配器的权衡

  • 类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
  • 对于类适配器由于适配器直接继承了 Adaptee,使得适配器不能和 Adaptee 的子类一起工作,因为继承是静态的关系,当适配器继承了 Adaptee 后,就不可能再去处理 Adaptee 的子类了。
  • 对于对象适配器一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
  • 对于类适配器适配器可以重定义 Adaptee 的部分行为,相当于子类覆盖父类的部分实现方法。
  • 对于对象适配器要重定义 Adaptee 的行为比较困难,这种情况下,需要定义 Adaptee 的子类来实现重定义,然后让适配器组合子类。虽然重定义 Adaptee 的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
  • 对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到 Adaptee。
  • 对于对象适配器,需要额外的引用来间接得到 Adaptee。
    '
    建议尽量使用对象适配器的实现方式,多用合成或聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。2

接口适配器

当一个接口当中有很多的方法,但是只想实现其中的几个,如果直接实现接口,就需要实现所有的方法,会显得实现类很臃肿,这个时候可以通过一个抽象类来实现接口,将不需要实现的方法置空,然后写一个类来继承抽象类就可以了。

代码略

个人感觉接口适配器更像一种接口实现的优化方式。
同时如果说一个接口里面有太多的方法,按照设计原则上来说,是应该对这个接口里的方法进行下细分的。

适配器适用场景

1 在不修改原来接口源码的条件下,将原来的接口转换成新的接口。
2 提供一个高重用的类,可以供多处使用。例如一个手机壳,当我去小米公司上班,通过手机壳将手机伪装成小米手机,去华为就伪装成华为手机。但实际上我用的还是诺基亚。

适配器优缺点

优点:提高了复用性以及扩展性
缺点:提高代码复杂性,方法调用不是很直观,明明调用的 A,结果调用的是 B 也可能是 C。反正能少用就少用,如果用也要写好注释。

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    43 引用 • 44 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    372 引用 • 1858 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 101 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 56 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 4 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    591 引用 • 3528 回帖 • 1 关注
  • OneDrive
    2 引用 • 6 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 677 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 3 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 2 关注
  • RemNote
    2 引用 • 16 回帖 • 25 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 507 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 277 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖 • 1 关注