# 結構型設計模式:
# 其主要用來處理乙個系統中不同實體(比如類和物件)之間關係,關注的是提供一種簡單的物件組合方式來創造新的功能。
# 當我們希望把乙個老元件用於乙個新組系統或者把乙個新元件應用於老系統中,同時在**無法修改的,
# 或者說無法訪問這些**時(在實際開發中,舊系統的**修改後牽一而動全身,很容易引起系統的崩潰。)。
# 這時候,我們可以編寫乙個額外的**層,該**層包含讓這兩個介面之間能夠通訊需要進行的所有修改。
# 介面卡模式(adapter pattern):將乙個類的介面轉換成為客戶希望的另外乙個介面.
# adapter pattern使得原本由於介面不相容而不能一起工作的那些類可以一起工作, 因為新的介面卡對不相容的地方進行了包裝修復.
# 應用場景:系統資料和行為都正確,但介面不符合時,目的是使控制範圍之外的乙個原有物件與某個介面匹配,
# 介面卡模式主要應用於希望復用一些現存的類,但介面又與復用環境不一致的情況
意圖:將乙個類的介面轉換成客戶希望的另乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
角色:目標介面(target)
待適配的類(adaptee)
介面卡(adapter)
兩種實現方式:
類介面卡:使用多繼承
物件介面卡:使用組合
適用場景:
你想使用乙個已經存在的類,而它的介面不符合你的要求;
你想建立乙個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定相容的類)協同工作。
(物件介面卡)想使用一些已經存在的子類,但不可能對每乙個都進行子類化以匹配它們的介面。物件介面卡可以適配它的父類介面。
類介面卡和物件介面卡有不同的權衡。
類介面卡規則:
使用乙個具體的adapter類對adaptee和target進行匹配。結果是當我們想要匹配乙個類以及所有他的子類時,類adapter將不能勝任工作。
使用adapter可以重定義adapter的部分行為,因為adapter是adaptee的乙個子類。
僅僅引入乙個物件,並不需要額外的指標以間接得到adaptee.
物件介面卡規則:
允許乙個adapter與多個adaptee -- 即adaptee本身以及它的所有子類(如果有子類的話)一一同時工作。adapter也可以一次給所有的adaptee新增功能。
使得重定義 adaptee 的行為比較困難。這需要生成adaptee的子類並且使得 adapter 引用這個子類而不是引用adaptee本身。
from abc import介面卡模式abstractmethod, abcmeta
class payment(metaclass=abcmeta):
@abstractmethod
defpay(self, money):
raise
notimplementederror
class
alipay(payment):
defpay(self, money):
print("
支付寶支付%s元
"%money)
class
defpay(self, money):
print("
蘋果支付%s元
"%money)
#------待適配類------
class
wechatpay:
defhuaqian(self, money):
print("
"%money)
#------類介面卡------
class
realwechatpay(payment, wechatpay):
defpay(self, money):
return
self.huaqian(money)
#------物件介面卡------
class
payadapter(payment):
def__init__
(self, payment):
self.payment = payment #
類的乙個物件
defpay(self, money):
return
self.payment.huaqian(money)
realwechatpay().pay(100)
#payadapter(wechatpay()).pay(1000)
介面卡模式
from abc import介面卡abstractmethod, abcmeta
class payment(metaclass=abcmeta):
@abstractmethod
defpay(self, money):
"""支付方法,引數money
"""pass
#實現payment介面
class
alipay(payment):
defpay(self, money):
print("
支付寶支付%s元
"%money)
class
defpay(self, money):
print("
蘋果支付%s元
"%money)
class paymentx(metaclass=abcmeta):
@abstractmethod
defzhifu(self, money):
"""支付方法,引數money
"""pass
class
wechatpay(paymentx):
defzhifu(self, money):
print("
"%money)
class
creditcardpay(paymentx):
defzhifu(self, money):
print("
信用卡支付%s元
" %money)
class
paypalpay(paymentx):
defzhifu(self, money):
print("
信用卡支付%s元
" %money)
#類介面卡
class
realwechatpay(payment, wechatpay):
defpay(self, money):
self.zhifu(money)
p =realwechatpay()
p.pay(100)
#物件介面卡
class
realpay(payment):
def__init__
(self, payment_cls):
self.
__a =payment_cls()
defpay(self, money):
self.
__a.zhifu(money)
deftest_payment(p):
p.pay(100)
test_payment(realpay(creditcardpay))
介面卡
class target(object):def request(self):
print("普通請求")
class adaptee(object):
def specific_request(self):
print("特殊請求")
# 繼承自target, 讓它使用新版本的類來實現舊版本的類中的功能, 舊版本**是不能動的
class adapter(target):
def __init__(self):
self.adaptee = adaptee()
def request(self):
self.adaptee.specific_request()
if __name__ == "__main__":
target = adapter()
target.request()
設計模式 介面卡模式 類介面卡 物件介面卡
乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式 介面卡模式
01 02 author rollen holt 設計模式之 介面卡模式 03 04 05 inte ce window 11 12 abstract class windowadapter 16 public void close 19 public void activated 22 publi...