文档章节

python 设计模式之适配器模式 Adapter Class/Object Pattern

o
 osc_wws45aot
发布于 2019/08/21 15:12
字数 1998
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

#写在前面

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

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

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

 

这两天比较忙,一直没时间写,今天(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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Python设计模式 - 总览(更新中...)

最近打算重构部分python项目,有道是"工欲善其事,必先利其器",所以有必要梳理一下相关设计模式。每次回顾基本概念或底层实现时都会有一些新的收获,希望这次也不例外。 本系列打算先简略介...

osc_u6io2wi5
2018/08/20
20
0
适配器模式

适配器模式(adapter pattern) 定义 我喜欢的样子你都有 你喜欢的样子我有没有 没有的话,我送你个适配器,好吗 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不...

osc_i05nmotv
2018/10/18
2
0
使用python解释设计模式[译]

使用python解释设计模式 原文地址 有没有好奇过设计模式是什么呢?在这篇文章中,我们将了解为什么设计模式是重要的,同时也会给出一些python的例子,解释为什么以及在什么时候使用设计模式。...

Jefffrey
2019/09/29
0
0
Java设计模式

设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案...

osc_dwomrlil
2019/08/28
2
0
常用的设计模式有哪些?

创建型 工厂模式与抽象工厂模式 (Factory Pattern)(Abstract Factory Pattern) 单例模式 (Singleton Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结构型...

osc_vyztkm1b
2019/12/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

setShadowLayer阴影与SetMaskFilter发光效果

一、setShadowLayer构造函数 public void setShadowLayer(float radius, float dx, float dy, int color) radius:模糊半径,radius越大越模糊,越小越清晰,但是如果radius设置为0,则阴...

IamOkay
28分钟前
31
0
做儿媳的,千万不要把婆婆当亲妈看

我和老公结婚有三四个年头了,还生育了两个调皮可爱的孩子。在别人眼里,我就像掉进了福窝里一样。然而我有时候在老公面前耍小性子,撒娇卖萌什么样的,婆婆却指责我不守妇道。 结婚起初婆家...

创业hzcya
38分钟前
6
0
多线程之线程部分

① 进程与线程 程序、进程、线程、协程的概念 程序: 用某种语言编写的一组指令的集合,即指一段静态的代码; 进程:简单地说就是一个正在执行的程序或应用,是资源分配的最小单位; 线程:线...

Arno_pei
51分钟前
0
0
08VulKan——描述符布局、缓冲、描述符池和描述符集

整体思想: 对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的 。VulKan提出使用资源描述符解决这种全局变量, 描述符是用来在着...

黑白双键
今天
7
0
将分段视频合并

环境 操作系统:Ubuntu Kylin 优麒麟 20.04 LTS 适用架构:AMD64、ARM64(鲲鹏、飞腾) 方法 将下载的视频分片段放入同一个文件夹。按片段排序的文件名汇入list.txt。 ls qq_video*.mp4 | s...

chipo
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部