功能:
將乙個類的介面轉換成客戶希望的另外乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
適用場景:
1、已經存在的類的介面不符合我們的需求;
2、建立乙個可以復用的類,使得該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定相容的類)協同工作;
3、在不對每乙個都進行子類化以匹配它們的介面的情況下,使用一些已經存在的子類。
類介面卡
// 具有特殊功能、但不符合我們既有的標準介面的類
class adaptee
}
// 目標介面,或稱為標準介面
inte***ce
target
// 具體目標類,只提供普通功能
class
concretetarget
implements
target
}
// 介面卡類,繼承了被適配類,同時實現標準介面
class
adapter
extends
adaptee
implements
target
}
// 測試類
public
class client
}
物件介面卡
// 介面卡類,直接關聯被適配類,同時實現標準介面
class
adapter
implements
target
public
void request()
}
// 測試類
public
class client
}
類介面卡和物件介面卡的權衡● 類介面卡使用物件繼承的方式,是靜態的定義方式;而物件介面卡使用物件組合的方式,是動態組合的方式。
● 對於類介面卡,由於介面卡直接繼承了adaptee,使得介面卡不能和adaptee的子類一起工作,因為繼承是靜態的關係,當介面卡繼承了adaptee後,就不可能再去處理 adaptee的子類了。
對於物件介面卡,乙個介面卡可以把多種不同的源適配到同乙個目標。換言之,同乙個介面卡可以把源類和它的子類都適配到目標介面。因為物件介面卡採用的是物件組合的關係,只要物件型別正確,是不是子類都無所謂。
● 對於類介面卡,介面卡可以重定義adaptee的部分行為,相當於子類覆蓋父類的部分實現方法。
對於物件介面卡,要重定義adaptee的行為比較困難,這種情況下,需要定義adaptee的子類來實現重定義,然後讓介面卡組合子類。雖然重定義adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用於所有的源。
● 對於類介面卡,僅僅引入了乙個物件,並不需要額外的引用來間接得到adaptee。
對於物件介面卡,需要額外的引用來間接得到adaptee。
建議盡量使用物件介面卡的實現方式,多用合成/聚合、少用繼承。當然,具體問題具體分析,根據需要來選用實現方式,最適合的才是最好的。
介面卡模式的優點
更好的復用性
系統需要使用現有的類,而此類的介面不符合系統的需要。那麼通過介面卡模式就可以讓這些功能得到更好的復用。
更好的擴充套件性
在實現介面卡功能的時候,可以呼叫自己開發的功能,從而自然地擴充套件系統的功能。
介面卡模式的缺點
過多的使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是a介面,其實內部被適配成了b介面的實現,乙個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式之 介面卡模式
1,介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法一起工作的兩個類能夠在一起工作 2,介面卡模式有兩種 1 類的介面卡模式 介面卡類繼承源類 這樣介面卡類就繼承了源類有的方法 並實現目標介面,實現在源類中沒有而在介面中有的方法,從而實現介面卡類有目標介面的所有方...
設計模式之介面卡模式
介面卡模式定義 將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間。簡單定義 封裝物件,並提供不同的介面。簡單例子 鴨子介面 package headfirst.adapter.ducks public inte ce duck 具體鴨子 package headfi...