1. 程式人生 > >Java設計模式----適配器模式

Java設計模式----適配器模式

國標 內部 實現 src 形象 怎麽辦 復雜 ont 適配器模式

電子設備之間有線數據傳輸常用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設計模式----適配器模式