#写在前面

看完了<妙味>和<华医>,又情不自禁的找小说看,点开了推荐里面随机弹出的<暗恋。橘生淮南>,翻了下里面的评论,有个读者从里面摘了一段自己很喜欢的话出来,我看了也很喜欢,放在下面。

‘我们都是 一样的人。庸庸碌碌,看上去不配拥有出众的故事;被生活撮成一堆,甚至不能拥有几许不同。然而,我们都知道自己那个独一无二的秘密。概括起来是几句雷同的话;铺展开来,却有着千差万别的纹路与质地。它像一个胎记,凝结在衣服下面,平常你不会刻意想起,却总在独自一人的秘密时刻,脱衣,洗澡,低下头,忽然看见。秘密让每个人变得不一样。’

我有强迫症,故事不好便不愿意看,故事很吸引人我又会熬夜,这种感觉很糟糕,睡不好觉,扰乱了生活。我真的得暂停一下,暂时不追剧,不追小说。

这两天比较忙,一直没时间写,今天(2019-08-23)知道了亚马逊热带雨林着火的新闻,真的好难过,以后我爬山绝不玩火。还有我尽量不浪费卫生纸,因为纸是用木头做的。

#引入1

软件开发中适配器的一般概念与物理世界中的相同。如果你去过不同的国家,你可能会认识到他们中的很多人使用不同形状的电源插座。很多时候,它们的形状使得电子设备的插头不适合。那么,您如何将手机或笔记本电脑的充电器连接到这些电源插座?

答案很简单。您将获得一个适配器,您可以将其放入电源插座,然后将其插入适配器的另一端。适配器更改了插头的形状,以便您可以使用电源插座。在那个例子和大多数其他情况下,适配器不提供任何附加功能。它只是让您将插头连接到电源插座。

#引入2

适配器就是一种适配中间件,将两种不匹配的东西进行适配连接,举一个生活中的例子。小金最近买了最新款的macbook pro,但是发现电脑的数据接口都变成了Type c接口,这导致了之前的所有的 usb设备都不可用。那应该怎么办呢?这个时候就需要淘宝买一个能够将type c 转换成usb的器件,我们称之为适配器。

那么适配器模式又是什么呢?适配器模式就是从适配器获得的灵感,将两种不太适配的代码进行适配,这种模式就是适配器模式了。

#适配器模式解决什么问题

适配器模式解决的问题是,使得原本由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作、可以进行统一管理。

将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)

#适配器模式定义

适配器模式的定义是,Convert the interface of a class into another interface clients expect,将某个类的接口转换为接口客户所需的类型。

 

#适配器模式有三个不同的版本

对适配器模式进行了一些研究,您会发现它有两个不同的版本:

1.使用继承实现适配器的类适配器模式。

2.使用组合引用的对象适配器模式。

1.类适配器模式

类的适配器模式将适配者类中的方法继承过来变成目标类的API

从上图中Target接口可以看出客户端需要 operation1方法和operation2方法,但是Adaptee(适配者类)中只提供了operation1方法,这时通过Adapter(适配器类)继承Adaptee并且补充缺失的operation2方法满足了 客户端的需求

2.对象适配器模式

 与类的适配器模式不同,对象适配器模式不是通过继承连接到Adaptee(适配者),而是通过委派的方式连接Adaptee

从上图中可以看出客户端需要operation1方法和operation2方法,但是Adaptee类中只提供了operation1方法。为了使客户端能够使用Adaptee,需要一个适配器类,将operation1方法通过 Adaptee实例委派给Adaptee类处理,并且自己实现Adaptee中没有提供的operation2方法。
 

3.缺省适配器模式

 这个社会有N中职业(job),但是每个人(people)只可能从事其中一种或者几种,职业类型设成一个接口,难道每次给人设置职业的时候要全部实现吗?在这里就要有一个缺省适配器,缺省适配器是个抽象类,仅仅implements而不实现。然后客户端直接使用Adapter即可选择需要实现的方法,而不用实现全部。
 
 

#适配器模式的优点

1.适配器模式的一个优点是不需要更改现有的类或接口。通过引入一个作为接口和类之间的适配器的新类,可以避免对现有代码进行任何更改。这限制了对软件组件的更改范围,并避免了其他组件或应用程序中的任何更改和副作用。

2. 适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。

#适配器模式的缺点

1.要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源

2.需要额外的引用来间接得到Adaptee

#适配器模式的角色

适配器模式包含一下三个角色:

1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于java、php语言不支持多重继承,所以它只能是接口。

2:Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。

3:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。

#应用场景

适配器模式主要应用于希望复用一些现存的类,但是接口要求又与复用环境要求不一致的情况

#举个例子

这里只关注设计模式,忽略了类的复杂度。

#target, 需要安卓的充电县
class Android:
def __init__(self):
pass
def connect_mobile(self,mobile):
print('我是安卓手机,需要安卓手机充电线')
mobile.connectAn() #adapter
class Adapter:
def __init__(self):
self._connectApple=Apple()
def connectAn(self):
print('适配器来了,是个转换接口,苹果充电线接上适配器就能给安卓手机充电了')
self._connectApple.connectAp() #adaptee , 这是个苹果手机的充电线
class Apple:
def __init__(self):
pass
def connectAp(self):
print('有苹果手机充电线') if __name__=='__main__':
androidM=Android()
adapter=Adapter()
androidM.connect_mobile(adapter)

#参考

https://www.2cto.com/kf/201701/587563.html

https://www.jianshu.com/p/d8cb02e04820

http://baijiahao.baidu.com/s?id=1602052478806736569&wfr=spider&for=pc

https://cloud.tencent.com/developer/news/385217

https://my.oschina.net/kimyeongnam/blog/3026273

https://segmentfault.com/a/1190000019443493?utm_source=tag-newest

https://blog.csdn.net/KeJianLinLiu/article/details/82780629

python 设计模式之适配器模式 Adapter Class/Object Pattern的更多相关文章

  1. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  2. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  3. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  4. python设计模式之适配器模式

    python设计模式之适配器模式 结构型设计模式一个系统中不同实体(比如,类和对象)之间的关系,关注的是提供一种简单的对象组合方式来创造功能. 适配器模式( Adapter pattern)是一种结构 ...

  5. 二十四种设计模式:适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  6. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  7. Java设计模式之适配器模式(Adapter Pattern)

    Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 还有一类是Class Adapter.因为Class Adapter的 ...

  8. 夜话JAVA设计模式之适配器模式(adapter pattern)

    适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...

  9. 【UE4 设计模式】适配器模式 Adapter Pattern

    概述 描述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper). 套路 Target(目标抽象类) 目标抽象类定义了客户所需要的接口,可 ...

随机推荐

  1. PyQt5入门

    PyQt5 是用来创建Python GUI应用程序的工具包.作为一个跨平台的工具包,PyQt可以在所有主流操作系统上运行(Unix,Windows,Mac). 本文描述Windows系统下如何安装Py ...

  2. windows nginx

    nginx.exe -s stop stop是快速停止nginx,可能并不保存相关信息: nginx.exe -s quit quit是完整有序的停止nginx,并保存相关信息. nginx.exe ...

  3. 批处理引擎MapReduce编程模型

    批处理引擎MapReduce编程模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce是一个经典的分布式批处理计算引擎,被广泛应用于搜索引擎索引构建,大规模数据处理 ...

  4. JavaScript解析机制之变量提升

    1.什么是预解析? 在当前作用域下,JS 运行之前,会把带有 var 和 function 关键字的事先声明,并在内存中安排好.(这个过程也可以理解为变量提升)然后再从上到下执行 JS 语句(预解析只 ...

  5. webpack loader和插件的编写原理

    webpack自定义loader和插件的api网址:https://www.webpackjs.com/api/loaders/ 点击顶部API,看左侧api: 1. 如何编写一个loader 实现的 ...

  6. 神经网络(13)--具体实现:random initialization

    Θ应初始化为什么值 当我们是用logistic regression算法时,将θ初始化为0是可以的:但是如果在神经网络里面,将θ初始化为0是不可行的 若将Θ初始化为0的后果-the problem o ...

  7. mysql跨表删除多条记录

    Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Product表和ProductPrice表.前者存在Product的基本信息, ...

  8. 2019CCPC网络赛 HD6707——杜教筛

    题意 求 $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)$,$1 \le n,a,b \l ...

  9. getchar()函数举例

    #include<stdio.h>void main(){ char ch; ch=getchar(); printf("%c",ch);}

  10. [TypeScript] Optional Chaining with TypeScript 3.7

    TypeScript 3.7 adds support for optional chaining. This lesson shows you how to use it in your code ...