Java設計模式----適配器模式
電子設備之間有線數據傳輸常用USB來進行,例如現在某果筆記本統一采用了USB type-c接口,而目前絕大多數即用即插存儲介質用的是USB type-b接口,那麽為了適配,往往需要消費者購買轉換塢等中間設備進行過渡,這種模式其實就是程序設計中常用的適配器模式,另一個形象的實例就是扳手為了擰動型號的螺栓,也需要相應的轉接頭進行適配。
1.適配器模式
以上兩個例子,體會一下就能明白適配器模式的用途了。
適配器模式(Adapter Pattern),將一個類的接口轉換成客戶希望的另一個接口。適配器模式讓那些接口不兼容的類可以一起工作。
下面是適配器模式的UML類圖:
Target: 客戶端所希望的接口;
Adapter: 適配器,將Target請求適配到Adaptee的相應接口中處理;
Adaptee: 被適配的接口。
一般什麽時候使用適配器模式呢?系統比較陳舊的時候,客戶端更新,而短時間沒有辦法更新系統,而采取添加中間層的辦法采用適配器模式來兼容。
2.代碼實現
場景是這樣的:小紅去歐洲旅遊,發現歐標插座都是兩個圓孔的,需要相應的歐標插頭才能插入,而小紅的手機充電器的插頭是國標的,怎麽辦呢?只能用適配器,國標插頭插入適配器的國標一端,適配器的另一端歐標插頭插入歐標插座。
Socket,定義了插座,提供電源
/** * 插座,供電*/ interface Socket { void supplyPower(); }
歐洲標準插座
/** * 歐洲標準的插座,只能插入歐洲標準插頭 */ class EuroSocket implements Socket { @Override public void supplyPower() { System.out.println("歐洲插座供電。"); } }
適配器類,根據開閉原則和單一職責原則,可以實現各種標準插座的適配器
/** * 適配器接口,可以實現各種適配器*/ interface Adapter { void plugin(); }
這裏只實現歐洲插座標準的適配器
/** * 歐洲插座適配器 */ class EuroSocketAdapter implements Adapter { private Socket euroSocket; public EuroSocketAdapter(final Socket socket) { euroSocket = socket; } @Override public void plugin() { System.out.println("適配器插入歐洲插座。"); euroSocket.supplyPower(); } }
調用
public class AdpaterDemo { public static void main(String[] args) { Adapter adapter = new EuroSocketAdapter(new EuroSocket()); System.out.println("小紅將充電器插入適配器。"); adapter.plugin(); } }
輸出結果
小紅將充電器插入適配器。
適配器插入歐洲插座。
歐洲插座供電。
3.總結
下面是與適配器模式“類似”模式與適配器模式的區別:
適配器模式:為了讓客戶使用老接口而新增的、客戶所期望的接口;
代理模式:與被代理的接口相同,控制客戶的訪問;
裝飾器模式:加強接口的功能,增加額外效果;
外觀模式:提供一個簡潔的接口,內部處理一系列復雜的邏輯。
Java設計模式----適配器模式