適配器模式(Adapter Pattern)
適配器模式將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
看個例子
還記得策略模式裏的鴨子接口嗎?假設這些鴨子類是屬於農場的,農場通過Quack和Fly觀察着鴨子的情況。今天這個農場又要多養一些火雞,農場主希望不要改變原來Quack和Fly的方法來觀察養的動物。如果直接讓火雞實現Duck接口也不太現實,火雞畢竟不是鴨子,火雞的叫法也不是Quack。不過,我們能否創建一支披着鴨皮的火雞呢?
type Ducky interface{
Quack()
Fly()
}
type Turkey interface{
Gobble()
Fly()
}
意圖
將類的接口轉換爲兼容的接口,一個適配器允許不兼容的類一起工作
組成部分
-
Target
目標接口,一般是我們想用適配器轉換獲取的新的目標接口(Duck)
-
Adaptee
被適配者,適配器應用的對象(Turkey)
-
Adapter
適配器,轉換接口的類
實現方式
-
對象適配器
對象適配器的實現如上圖的A,非多繼承或繼承,用委託的方式。對象實現適配器模式,可以讓被適配者的子類都搭配着適配器使用。
-
類適配器
類適配器的實現如上圖的B,使用多繼承或繼承的方式來實現,好處在於不用像對象那樣實現所有的方法。
範例代碼
分別用對象適配器和類適配器實現適配器模式範例代碼
這兩種方式的主要區別在於Adapter中Quack的實現方式
總結
- 這個模式可以通過創建適配器進行接口轉換,讓不兼容的接口變成兼容。
- 如果想要改變接口,適配器部分可以將改變的部分封裝起來,客戶就不必爲了應對不同的接口而每次跟着修改。
- 客戶和被適配者是解耦的。
的接口變成兼容。 - 如果想要改變接口,適配器部分可以將改變的部分封裝起來,客戶就不必爲了應對不同的接口而每次跟着修改。
- 客戶和被適配者是解耦的。