python 设计模式之适配器模式 Adapter Class/Object Pattern
#写在前面
看完了<妙味>和<华医>,又情不自禁的找小说看,点开了推荐里面随机弹出的<暗恋。橘生淮南>,翻了下里面的评论,有个读者从里面摘了一段自己很喜欢的话出来,我看了也很喜欢,放在下面。
‘我们都是 一样的人。庸庸碌碌,看上去不配拥有出众的故事;被生活撮成一堆,甚至不能拥有几许不同。然而,我们都知道自己那个独一无二的秘密。概括起来是几句雷同的话;铺展开来,却有着千差万别的纹路与质地。它像一个胎记,凝结在衣服下面,平常你不会刻意想起,却总在独自一人的秘密时刻,脱衣,洗澡,低下头,忽然看见。秘密让每个人变得不一样。’
我有强迫症,故事不好便不愿意看,故事很吸引人我又会熬夜,这种感觉很糟糕,睡不好觉,扰乱了生活。我真的得暂停一下,暂时不追剧,不追小说。
这两天比较忙,一直没时间写,今天(2019-08-23)知道了亚马逊热带雨林着火的新闻,真的好难过,以后我爬山绝不玩火。还有我尽量不浪费卫生纸,因为纸是用木头做的。
#引入1
软件开发中适配器的一般概念与物理世界中的相同。如果你去过不同的国家,你可能会认识到他们中的很多人使用不同形状的电源插座。很多时候,它们的形状使得电子设备的插头不适合。那么,您如何将手机或笔记本电脑的充电器连接到这些电源插座?
答案很简单。您将获得一个适配器,您可以将其放入电源插座,然后将其插入适配器的另一端。适配器更改了插头的形状,以便您可以使用电源插座。在那个例子和大多数其他情况下,适配器不提供任何附加功能。它只是让您将插头连接到电源插座。
#引入2
适配器就是一种适配中间件,将两种不匹配的东西进行适配连接,举一个生活中的例子。小金最近买了最新款的macbook pro,但是发现电脑的数据接口都变成了Type c接口,这导致了之前的所有的 usb设备都不可用。那应该怎么办呢?这个时候就需要淘宝买一个能够将type c 转换成usb的器件,我们称之为适配器。
那么适配器模式又是什么呢?适配器模式就是从适配器获得的灵感,将两种不太适配的代码进行适配,这种模式就是适配器模式了。
#适配器模式解决什么问题
适配器模式解决的问题是,使得原本由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作、可以进行统一管理。
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)
#适配器模式定义
#适配器模式有三个不同的版本
1.使用继承实现适配器的类适配器模式。
2.使用组合引用的对象适配器模式。
1.类适配器模式
类的适配器模式将适配者类中的方法继承过来变成目标类的API
从上图中Target接口可以看出客户端需要 operation1方法和operation2方法,但是Adaptee(适配者类)中只提供了operation1方法,这时通过Adapter(适配器类)继承Adaptee并且补充缺失的operation2方法满足了 客户端的需求
2.对象适配器模式
3.缺省适配器模式
#适配器模式的优点
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的更多相关文章
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
- python设计模式之适配器模式
python设计模式之适配器模式 结构型设计模式一个系统中不同实体(比如,类和对象)之间的关系,关注的是提供一种简单的对象组合方式来创造功能. 适配器模式( Adapter pattern)是一种结构 ...
- 二十四种设计模式:适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...
- 【设计模式】适配器模式 Adapter Pattern
适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...
- Java设计模式之适配器模式(Adapter Pattern)
Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 还有一类是Class Adapter.因为Class Adapter的 ...
- 夜话JAVA设计模式之适配器模式(adapter pattern)
适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...
- 【UE4 设计模式】适配器模式 Adapter Pattern
概述 描述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper). 套路 Target(目标抽象类) 目标抽象类定义了客户所需要的接口,可 ...
随机推荐
- atoi()和itoa()函数详解以及C语言实现
atoi()函数 atoi()原型: int atoi(const char *str ); 函数功能:把字符串转换成整型数. 参数str:要进行转换的字符串 返回值:每个函数返回 int 值,此值 ...
- 使用Cloudera Manager搭建Kudu环境
使用Cloudera Manager搭建Kudu环境 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.点击添加服务进入CM服务安装向导 2>.选择需要安装的kudu ...
- Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块
Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ...
- mysql 两张表字段模糊匹配--字符串拼接函数
concat(A,B,C,...) 拼接字符串 例如concat('123','***','345') =>123***345 SELECT concat( substr(t1.CODE, ...
- vue 中数据共享的方式
1.父子组件的数据传递2.store模式 - 局部的数据共享3.vuex 中共享 state - 全局的数据共享
- CH5E26 扑克牌
题意 5E26 扑克牌 0x5E「动态规划」练习 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 张牌中的若干张,请计算将它们排成一列, ...
- drf框架 - 请求模块 | 渲染模块
Postman接口工具 官方 https://www.getpostman.com/ get请求,携带参数采用Paramspost等请求,提交数据包可以采用三种方式:form-date.urlenc ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) Fast RCNN 算法详解
继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度.在Github上提供了源码. 同样使用最大规模的网络,Fast ...
- sentinel主从切换技术
主从切换技术的方法是: 当主服务器宕机后,需要手动把一台从服务器切换为主服务器, 这就需要人工干预,费事费力,还会造成一段时间内服务不可用. 这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式. 一 ...
- MySQL常用五大引擎的区别
MyISAM: 如果你有一个 MyISAM 数据表包含着 FULLTEXT 或 SPATIAL 索引,你将不能把它转换为使用 另一种引擎,因为只有 MyISAM 支持这两种索引. BLOB: 如果你有 ...