设计模式 ——— 适配器模式

ADAPTER(适配器) ———— 类对象结构型模式

意图

将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。 现在,我们知道,这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。

适配器模式的本质:转换匹配,复用功能。 适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配是手段,而复用已有的功能才是目的。

适用性

  • 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口
  • 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么
  • (仅适用于“对象”适配器)如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了。

结构

“类”适配器使用多重继承对一个接口与另一个接口进行匹配

“类”适配器结构图

“对象”适配器依赖于对象组合

“对象”适配器结构图

  • Target 定义Client使用的与特定领域相关的接口。
  • Client 与符合Target接口的对象协同
  • Adaptee 定义一个已经存在的接口,这个接口需要适配
  • Adapter 对Adaptee的接口与Target接口进行适配

协作

Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。

适配器模式的实现

  • “对象”适配器 这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。
  • “类”适配器 “类”适配器需要多重继承才能够实现它,这在Java中是不可能的。但是当你在使用多重继承语言的时候,还是可能遇到这样的需求。 “对象”适配器 VS “类”适配器 “对象”适配器和“类”适配器使用两种不同的适配方式(分别是组合与继承)。“类”适配器继承了Target和Adaptee;而“对象”适配器利用组合的方式将请求传送给被适配者。 “类”适配器: a) 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,“类”适配器将不能胜任工作。 b) 是的Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。 c) 仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。 “对象”适配器: a) 允许一个Adapter与多个Adaptee ———— 即Adaptee本身以及它的所有子类(如果有子类的话)一同工作。 b) 是的重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是Adaptee本身。
  • 智能适配器 在实际开发中,适配器也可以实现一些Adaptee没有实现,但是在Target中定义的功能,这种情况就需要在适配器的实现里面,加入新功能的实现,这种适配器被称为智能适配器。 如果要使用智能适配器,一般新加入的功能的实现,会用到很多Adaptee的功能,相当于利用Adaptee的功能来实现更高层的功能。当然也可以完全实现新加的功能,跟已有的功能都不靠边,变相是扩展了功能。
  • 适配多个Adaptee 适配器在适配的时候,可以适配多个Adaptee,也就是说实现某个新的Target的功能的时候,需要调用到多个模块的功能,适配多个模块的功能才能满足新接口的要求。
  • 缺省适配 缺省适配的意思是:为一个接口提供缺省实现。有了它,就不用直接去实现接口,而是采用继承这个缺省适配对象,从而让子类可以有选择的去覆盖实现需要的方法,对于不需要的方法,就使用缺省适配的方法就可以了。
  • 双向适配器 适配器也可以实现双向的适配,前面我们讲的都是把Adaptee适配成为Target,其实也可以把Target适配成为Adaptee,也就是说这个适配器可以同时当作Target和Adaptee来使用。在两个不同的客户需要用不同的方式查看同一个对象时,双向适配器尤其有用。

相关模式

  • 适配器模式 VS 装饰模式 适配器模式与装饰模式很类似,但仅仅是类似,造成这种类似的原因:两种设计模式在实现上都是使用的对象组合,都可以在转调组合对象的功能前后进行一些附加的处理,因此有这么一个相似性。它们的目的和本质都是不一样的。一般适配器适配是需要改变接口的;而装饰模式是不改接口的,无论多少层装饰都是一个接口。 装饰模式的本质是扩展包装的对象的行为或责任;而适配器模式本质是转换匹配,复用功能。
参考

《Head First 设计模式》 《设计模式:可复用面向对象软件的基础》 《研磨设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

观察者设计模式 Vs 事件委托(java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1742
来自专栏用户2442861的专栏

*Android面试实战总结2

 接上一篇 往下写 http://blog.csdn.net/u011733020/article/details/45998861  ,   非常感谢在上...

1083
来自专栏KK的小酒馆

Android设计模式一

模式定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使子类可以不改变(复用)一个算法的结构即可重定义...

1232
来自专栏tkokof 的技术,小趣及杂念

Coroutine,你究竟干了什么?(小续)

前篇中讲了一些自己关于Coroutine的理解,后来陆陆续续的又想到了一些,在此简单记录一下,内容不多,故作“小”续吧 :)

872
来自专栏后端技术探索

非Java程序员竟鲜有人真正理解DI和IOC

小编在后端圈也算是阅人无数了, 发现一个现象,Java程序员对于面向对象语言的基础知识整体掌握比较扎实,而类似PHP,Python的初级甚至中级程序员就比较薄弱...

2072
来自专栏菩提树下的杨过

rpc框架之gRPC 学习 - hello world

grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导...

7887
来自专栏Jimoer

经历的面试题,先做下部分总结。

1693
来自专栏编程

工厂模式进阶之Android中工厂模式源码分析

Android工厂模式源码分析 本文对Android源码中所涉及到的工厂模式进行分析(源码不会涉及的具体的细节,具体细节读者请另查相关阅资料),最后再给出安卓中...

2329
来自专栏WindCoder

Java设计模式学习笔记—适配器模式

文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Adapter包(package)中。

1461
来自专栏KK的小酒馆

Android设计模式二

在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。

1112

扫码关注云+社区

领取腾讯云代金券