1. 程式人生 > >設計模式(三)【Adapter模式】

設計模式(三)【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將一個已有的介面轉為另一個介面

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