github地址:https://github.com/cheesezh/python_design_patternspython
適配器模式,將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做[DP]。git
當系統的數據和行爲都正確,可是接口不符時,咱們應該考慮使用適配器模式,目的就是使控制範圍以外的一個原有對象與某個接口匹配。適配器模式主要應用於但願複用一些現存的類,可是接口又與複用環境要求不一致的狀況。github
class Target(): """ Target類,這是客戶所期待的接口。能夠是具體或抽象的類,也能夠是接口。 """ def request(self): print("普通請求") class Adaptee(): """ 須要適配的類 """ def specific_request(self): print("特殊請求") class Adapter(Target): """ 適配器,經過內部包裝一個Adaptee對象,把源接口轉換成目標接口 """ def __init__(self): self.adaptee = Adaptee() def request(self): self.adaptee.specific_request() def main(): target = Adapter() target.request() main()
特殊請求
想使用一個已經存在的類,但若是它的接口,也就是它的方法和你的要求不想同時,就應該考慮使用適配器模式。翻譯
對於公司內部獨立開發的系統,類和方法名的規範應當在設計之初就規定好,當接口不相同時,首先不該該考慮使用適配器,而是應該考慮經過重構統一接口。設計
只有在雙方都不太容易修改的時候再使用適配器模式。code
可是若是設計之初,咱們準備使用第三方開發組件,而這個組件的接口於咱們本身的系統接口是不相同的,而咱們也徹底沒有必要爲了迎合它而改動本身的接口,此時儘管在開發的設計階段,也就是能夠考慮用適配器模式來解決接口不一樣的問題。orm
用程序模擬姚明到國外打NBA初期依賴翻譯的場景。對象
from abc import ABCMeta, abstractmethod class Player(): __metaclass__ = ABCMeta def __init__(self, name): self.name = name @abstractmethod def attack(self): pass @abstractmethod def defense(self): pass class Forwards(Player): def attack(self): print("Forward {} attack".format(self.name)) def defense(self): print("Forward {} defense".format(self.name)) class Guards(Player): def attack(self): print("Guards {} attack".format(self.name)) def defense(self): print("Guards {} defense".format(self.name)) class ForeignCenter(): def __init__(self, name): self.name = name def jingong(self): print("Center {} jingong".format(self.name)) def fangshou(self): print("Center {} fangshou".format(self.name)) class Translator(Player): def __init__(self, name): self.foreign_center = ForeignCenter(name) def attack(self): self.foreign_center.jingong() def defense(self): self.foreign_center.fangshou() forwards = Forwards("FFF") forwards.attack() guards = Guards("GGG") guards.defense() center = Translator("CCC") center.attack() center.defense()
Forward FFF attack Guards GGG defense Center CCC jingong Center CCC fangshou