python 設計模式之適配器模式 Adapter Class/Object Pattern

#寫在前面

看完了<妙味>和<華醫>,又不由自主的找小說看,點開了推薦裏面隨機彈出的<暗戀。橘生淮南>,翻了下里面的評論,有個讀者從裏面摘了一段本身很喜歡的話出來,我看了也很喜歡,放在下面。php

‘咱們都是 同樣的人。庸庸碌碌,看上去不配擁有出衆的故事;被生活撮成一堆,甚至不能擁有幾許不一樣。然而,咱們都知道本身那個獨一無二的祕密。歸納起來是幾句雷同的話;鋪展開來,卻有着千差萬別的紋路與質地。它像一個胎記,凝結在衣服下面,日常你不會刻意想起,卻總在獨自一人的祕密時刻,脫衣,洗澡,低下頭,突然看見。祕密讓每一個人變得不同。’html

我有強迫症,故事很差便不肯意看,故事很吸引人我又會熬夜,這種感受很糟糕,睡很差覺,擾亂了生活。我真的得暫停一下,暫時不追劇,不追小說。java

 

這兩天比較忙,一直沒時間寫,今天(2019-08-23)知道了亞馬遜熱帶雨林着火的新聞,真的好難過,之後我登山毫不玩火。還有我儘可能不浪費衛生紙,由於紙是用木頭作的。python

 

 #引入1

軟件開發中適配器的通常概念與物理世界中的相同。若是你去過不一樣的國家,你可能會認識到他們中的不少人使用不一樣形狀的電源插座。不少時候,它們的形狀使得電子設備的插頭不適合。那麼,您如何將手機或筆記本電腦的充電器鏈接到這些電源插座?android

答案很簡單。您將得到一個適配器,您能夠將其放入電源插座,而後將其插入適配器的另外一端。適配器更改了插頭的形狀,以便您可使用電源插座。在那個例子和大多數其餘狀況下,適配器不提供任何附加功能。它只是讓您將插頭鏈接到電源插座。segmentfault

 

 

 #引入2

 適配器就是一種適配中間件,將兩種不匹配的東西進行適配鏈接,舉一個生活中的例子。小金最近買了最新款的macbook pro,可是發現電腦的數據接口都變成了Type c接口,這致使了以前的全部的 usb設備都不可用。那應該怎麼辦呢?這個時候就須要淘寶買一個可以將type c 轉換成usb的器件,咱們稱之爲適配器。設計模式

那麼適配器模式又是什麼呢?適配器模式就是從適配器得到的靈感,將兩種不太適配的代碼進行適配,這種模式就是適配器模式了。app

 

 

#適配器模式解決什麼問題

適配器模式解決的問題是,使得本來因爲接口不兼容而不能一塊兒工做、不能統一管理的那些類能夠在一塊兒工做、能夠進行統一管理。ide

將一個接口轉換成客戶但願的另外一個接口,適配器模式使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)spa

 

#適配器模式定義

適配器模式的定義是,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

相關文章
相關標籤/搜索