設計模式(三) Adapter模式

2021-09-05 11:49:32 字數 1472 閱讀 7830

adapter模式(介面卡模式),將乙個類的介面轉換為客戶希望的另外乙個介面。它使得由於介面不相容而不能一起工作的類可以一起工作。即,我們要為乙個功能正確但是介面不合的物件建立乙個新的介面。

比如我們已經有了父類shape,子類point、square、line,而現在有乙個新的需求,需要乙個circle子類。但是現在我們已經有了xxcircle,並且xxcircle已經有了所有需要的功能(但是方法名不一樣)。

考慮到已經有其他模組使用xxcircle,故我們不能讓xxcircle繼承shape。但是我們又需要使用xxcircle的功能,所以在使circle繼承父類shape後,circle呼叫xxcircle的方法即可。

class

circle

extends

shape

public

void

display()

}

adapter的最常見用途就是保持多型性。

adapter模式

關鍵特徵

意圖使控制範圍外的乙個原有物件與某個介面匹配

問題系統的資料和行為匹配,但是介面不符。通常用於必須從抽象類派生時。

解決方案呢

adapter模式提供了具有所需介面的包裝類

參與者與協作者

adapter改變了adaptee的介面,使adaptee與adapter的基類target匹配。這樣client就可以使用adaptee了,好像它就是target的型別。

效果adapter使得原有物件能夠適應新的類結構,不受其介面的限制

實現將原有的類包含在另外乙個類中。讓包含類與需要的介面匹配,呼叫被包含類的方法。

adapter模式在具體應用時,往往原有類只能滿足部分功能,但是依然可以使用adapter模式,未能滿足的功能在包含類中實現即可。

實際上adapter模式有兩種

1、物件adapter模式——之前所說的內容就是物件adapter模式,因為它依賴於乙個物件(適配物件)包含另乙個物件(被適配物件)。

2、類adapter模式——另一種實現adapter模式的方式是通過多重繼承。這種情況下的adapter模式稱為類adapter模式。

類adapter模式的工作原理是建立乙個新類,該類同時從兩個類繼承:從定義其介面的抽象類公開繼承;從訪問其實現的原有類私有繼承。

facade與adapter比較

facade

adapter

是否存在既有的類?是是

是否必須按某個介面設計?否是

物件需要多型行為嗎?否可能

需要更簡單的介面嗎?是否

facade的動機是簡化介面,adapter儘管也是越簡單越好,但是設計必須遵循已有介面,不能簡化任何東西,即便存在更簡單的介面。

結論:facade簡化了介面,adapter將乙個已有的介面轉為另乙個介面

參考《設計模式解析》第二版

設計模式 Adapter

adapter設計模式本身並沒有什麼特別,直觀地說就是介面封裝,在使用到第三方庫時我們常常用到,第三方庫提供的介面過於全面,引數過多,在我們實際應用中可能不會用到,通過進一步封裝,提供很好的實際介面。class target class adapter class adaptee 基本上就是三個類協...

設計模式 Adapter

類adapter include using namespace std class cadaptee virtual cadaptee public void func1 virtual ctarget public virtual void func 0 class cadapter publi...

設計模式 Adapter

意圖 使控制範圍之外的乙個原有物件與某個介面匹配。問題 系統的資料和行為都正確,但介面不符。通常用於必須從抽象類派生時。實現 將原有類包含在另一類中。讓包含類與需要的介面匹配,呼叫被包容類的方法。adapter模式有兩種型別 物件adapter模式 依賴於乙個物件 適配物件 包含另乙個物件 被適配物...