適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
就像很多購買港版的電子設備一樣,直接買來是沒有辦法充電的,因為港版的插頭,全部都是那種很大的三孔的,大陸這邊有2空的,有小三孔的。所以在買電子設備的時候,最好再買一個轉換插頭,可以插在我們這邊的小插孔上,另一頭可以插上港版的那種大插頭(其實有那種通用的插排的,深圳比較多,因為深圳距離香港近……..)
適配器模式分類的適配器模式和對象的適配器模式兩種不同的形式。
類的適配器模式

如上圖,我現在有個接口,Targett,接口有2個方法methodA,methodB,有一個類Adaptee,只有一個methodA,這個時候就需要一個Adapter適配器,把他們關聯起來,
public interface Target { public void methodA(); public void methodB();}public class Adaptee { public void methodA(){ System.out.代碼比較簡單,就不啰嗦了。對象的適配器模式
與類的適配器模式一樣,對象的適配器模式把被適配的類的API轉換成為目標類的API,與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adaptee類,而是使用委派關系連接到Adaptee類。
public class Adapter implements Target{ private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void methodA() { this.adaptee.methodA(); } @Override public void methodB() { System.out.println("methodB"); }}類適配器和對象適配器的區別
類適配器使用對象繼承的方式,是靜態的定義方式;而對象適配器使用對象組合的方式,是動態組合的方式。
對于類適配器,由于適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一起工作,因為繼承是靜態的關系,當適配器繼承了Adaptee后,就不可能再去處理 Adaptee的子類了。
對于對象適配器,一個適配器可以把多種不同的源適配到同一個目標。換言之,同一個適配器可以把源類和它的子類都適配到目標接口。因為對象適配器采用的是對象組合的關系,只要對象類型正確,是不是子類都無所謂。
對于類適配器,適配器可以重定義Adaptee的部分行為,相當于子類覆蓋父類的部分實現方法。
對于對象適配器,要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類來實現重定義,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用于所有的源。
對于類適配器,僅僅引入了一個對象,并不需要額外的引用來間接得到Adaptee。
對于對象適配器,需要額外的引用來間接得到Adaptee。
建議盡量使用對象適配器的實現方式,多用合成/聚合、少用繼承。當然,具體問題具體分析,根據需要來選用實現方式,最適合的才是最好的。 適配器模式的優點 更好的復用性 系統需要使用現有的類,而此類的接口不符合系統的需要。那么通過適配器模式就可以讓這些功能得到更好的復用。
更好的擴展性 在實現適配器功能的時候,可以調用自己開發的功能,從而自然地擴展系統的功能。
適配器模式的缺點 過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
新聞熱點
疑難解答