介面卡模式解決的問題:讓原本因為介面不相容而不能一起工作的類可以一起工作。
介面卡模式的uml原理圖如下圖所示:
從上圖可見,客戶想要用target介面實現adaptee介面中的方法,但這顯然是不可能的。因此,我們需要定義乙個介面卡類adapter,讓它在target和adaptee之間做乙個「調停者」,進而達到target和adaptee的適配。
介面卡模式中有三種角色:
1) 目標介面target:使用者期望使用的介面,這個類可以是介面,也可以是抽象類或具體類;
2) 需要適配的類adaptee:當前系統中有的類;
3) 介面卡adapter:在現有介面和目標介面之間的「調停者」,作用是將現有介面轉換成目標介面。
介面卡模式的優點:
1) 通過介面卡模式,使用者在做相似的操作時可以呼叫同乙個介面,其內部過程對於使用者是透明的,這樣做更簡單、更直接、更解耦;
2) 復用了現存的類,解決了現存類和復用環境要求不一致的問題;
3) 將目標介面和現有介面解耦,通過引入乙個介面卡類,而無需修改原有的**。
介面卡模式的缺點:
使用介面卡模式後,如果想要改變適配物件,就需要更換介面卡,而更換介面卡是乙個非常複雜的過程。
介面卡模式的適用場景:
1) 當系統需要使用現有的類,而現有的類不符合系統的介面的時候;
2) 當期望的功能和系統中現有的某個類的功能相似,但是具有不同的介面的時候;
3) 當系統已經實現了某個功能,但使用者想要通過另一種介面方式訪問,而我們不想修改原有介面的時候;
4) 當使用的第三方元件的介面和系統中定義好的介面不同,但又不希望修改系統介面的時候。
介面卡模式有兩種實現形式:類適配模式和物件適配模式。下面通過乙個例項分別介紹這兩種模式。
需求:我們現在的系統中有乙個現有的類adaptee,這個類中有乙個adapteemethod()方法。但是使用者不想用adaptee這個累,他們想用乙個他們自己提供的介面target,這個介面中有乙個targetmethod()方法。雖然這兩個類的功能相同,但是target畢竟是乙個介面,我們無法直接呼叫adaptee類中的方法,而且我們也不想再把我們千辛萬苦寫好的adaptee類中的**重新寫一遍。我們該怎麼辦?
在解決上面的問題之前,我們先給出adaptee和target中的**:
adaptee類中的**:
public class adaptee
}
target介面中的**:
public inte***ce target
接下來,我們分別用類適配模式和物件適配模式定義adapter介面卡類,來解決上面的問題。
首先來看類適配模式的uml圖:
可以看到,類適配模式是將adapter類直接繼承adaptee,這樣就直接具有了adaptee中的adapteemethod()方法,然後直接在adapter中實現的target的targetmethod()方法中呼叫父類的方法即可達到適配效果。
adapter類中的**如下:
public class adapter extends adaptee implements target
}
測試**如下:
public class test
}
執行結果如下圖所示:
同理,先來看物件適配模式的uml圖:
可以看到,adapter不再繼承adaptee,而是持有乙個adaptee類的引用,即將乙個adaptee的物件引用到adapter類中,這就是物件適配模式的思路。同樣,在adapter的targetmethod()方法中呼叫adaptee物件的adapteemethod()方法即可完成適配。
adapter類中的**如下:
public class adapter implements target
}
測試**與類適配模式的測試**完全相同。執行結果如下圖所示:
以上就是對介面卡模式adapterpattern的介紹。
最後貼出介面卡模式的github**:【github - adapter】。
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式 (5)介面卡模式
介面卡模式 介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法在一起工作的兩個類能夠在一起工作。比如說我的hp筆記本,美國產品,人家美國的電壓是110v的,而我們中國的電壓是220v,要在中國能使用,必須找個變壓器轉一下電壓才可以。這個變壓器就是個介面卡。介面卡模式有...
設計模式之 介面卡模式
1,介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法一起工作的兩個類能夠在一起工作 2,介面卡模式有兩種 1 類的介面卡模式 介面卡類繼承源類 這樣介面卡類就繼承了源類有的方法 並實現目標介面,實現在源類中沒有而在介面中有的方法,從而實現介面卡類有目標介面的所有方...