標籤:java設計模式
現實中的問題
有一個插座,這個插座是三個口的,但是我們手上只有兩個觸角的插頭,一種笨方法就是直接強行把兩個觸角掰彎,插進去(這種事情我就做過),還有一種方法就是找一個轉換頭來。
看下面一張圖就大概明白了,很明顯現有系統很難和廠商提供的匹配,該怎麼做呢?那麼適配器這是就派上用場了
定義
將一個類的介面,轉換成客戶期望的另一個介面。適配器讓原本介面不相容的類可以合作無間。
接著上面問題
這個模式可以通過建立適配器進行介面轉換,讓不相容的介面變成相容。這可以讓客戶從實現的介面解耦。如果在一段時間之後,我們想要改變介面,適配器可以將改變的部分封裝起來,客戶就不必為了應對不同的介面每次跟著修改。
類圖如下:
如上適配器類圖包含的OO設計原則:使用對象組合,以修改的介面包括被適配者:這種做法還有額外的優點,那就是,被適配者的任何子類都可以搭配著適配者使用
代碼具體實現
1 、首先我們需要一個目標介面,也就是我們上面提到的三個口的插頭
target 目標
package Adapter;public interface ThreeInterface { public void OfferPowerForThree(); //三個口的插頭有 一 個 功能,能夠為三個觸角的插頭提供電源}
2、其次我們需要被適配者,也就是兩個觸角的插頭
package Adapter;public interface TwoInterface { public void OfferPowerForTwo();//兩個口的插頭有一個功 能,能夠為兩個觸角的插頭提供電源}實現:package Adapter;public class RealTwo implements TwoInterface{ @Override public void OfferPowerForTwo() { // TODO Auto-generated method stub System.out.println("我可以為兩個觸角的插頭提供電源!"); }}
3、需要一個適配器
package Adapter;public class ThreeToTwoAdapter implements ThreeInterface { TwoInterface twoInterface; public ThreeToTwoAdapter(TwoInterface twoInterface) { this.twoInterface=twoInterface; } @Override public void OfferPowerForThree() { // TODO Auto-generated method stub twoInterface.OfferPowerForTwo(); }}
4、需要一個情境,這個情境下面,沒有被是適配者可以直接用的資源,需要適配器進行轉換,在上面的例子中也就是有一個兩個觸角的插頭三十沒用可以用的兩個口的插座。
package Adapter;public class Test { //現在這快地方只有 三個口 的 插 座 ,但是插頭是兩個觸角的,需要一個適配器 public static void main(String []args) { //1、熟悉定義一個兩個觸角的插頭,這個是本來內建的 TwoInterface twoInterface=new RealTwo(); //2、定義一個適配器,使得三個口的插座可以為兩個觸角的插頭提供電源 ThreeInterface threeInterface=new ThreeToTwoAdapter(twoInterface); //3、提供電源 threeInterface.OfferPowerForThree(); }}
類適配器模式
上面提到的其實成為對象適配器模式,還有一種稱為類適配器模式,下面來看看類適配器模式:
類圖
類圖和對象適配器有點類似,唯一的差別就在於類適配器繼承了Target和Adaptee
適配器模式的優缺點
優點
- 將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,而無須修改原有代碼。
- 增加了類的透明性和複用性,將具體的實現封裝在適配者類中,對於用戶端類來說是透明的,而且提高了適配者的複用性。
- 靈活性和擴充性都非常好,通過使用設定檔,可以很方便地更換適配器,也可以在不修改原有代碼的基礎上增加新的適配器類,完全符合“開閉原則”。
類適配器模式還具有如下優點:
- 由於適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
對象適配器模式還具有如下優點:
- 一個對象適配器可以把多個不同的適配者適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配到目標介面。
缺點
類適配器模式的缺點如下: 對於Java、C#等不支援多重繼承的語言,一次最多隻能適配一個適配者類,而且目標抽象類別只能為抽象類別,不能為具體類,其使用有一定的局限性,不能將一個適配者類和它的子類都適配到目標介面。
對象適配器模式的缺點如下: 與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然後再把適配者類的子類當做真正的適配者進行適配,實現過程較為複雜。
java 設計模式-----適配器模式