設計模式(三)【Adapter模式】
Adapter模式
Adapter模式(介面卡模式),將一個類的介面轉換為客戶希望的另外一個介面。它使得由於介面不相容而不能一起工作的類可以一起工作。即,我們要為一個功能正確但是介面不合的物件建立一個新的介面。
比如我們已經有了父類Shape,子類Point、Square、Line,而現在有一個新的需求,需要一個Circle子類。但是現在我們已經有了XXCircle,並且XXCircle已經有了所有需要的功能(但是方法名不一樣)。
考慮到已經有其他模組使用XXCircle,故我們不能讓XXCircle繼承Shape。但是我們又需要使用XXCircle的功能,所以在使Circle繼承父類Shape後,Circle呼叫XXCircle的方法即可。
class Circle extends Shape{
private XXCircle myXXCircle;
public Circle(){
myXXCircle = new XXCircle();
}
public void display(){
XXCircle.displayIt();
}
}
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將一個已有的介面轉為另一個介面
參考《設計模式解析》第二版