適配器模式:快速兼容舊接口

這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰設計模式

整體來講設計模式分爲三大類:建立型模式、結構型模式、行爲型模式。前面的系列文章都是爲建立型模式:markdown

《單例模式——8種實現方式》ide

《工廠模式:工廠方法模式和抽象工廠模式》post

《原型模式:快速複製已有實例建立新的實例》學習

<建造者模式>編碼

從今天起,咱們開始學習結構型模式。spa

結構型模式:主要用於描述如何組合類和對象以得到更大的結構。設計

適配器模式

適配器模式(Adapter Pattern)定義:將一個類的接口轉換成客戶但願的另一個接口,使得本來因爲接口不兼容而不能一塊兒工做的那些類能一塊兒工做code

適配器模式核心意義:兼容舊接口orm

適配器在咱們生活中隨處可見,好比電源適配器,不少電器並非直接使用220V電源,而須要一個電源適配器才能正常使用;還有咱們筆記本電腦的外接接口,若是隻有一個HDMI接口,想用在只能使用VGA接口上的設備上,咱們就須要一個額外轉接頭,這個轉接頭咱們就稱做適配器。

適配器模式原理咱們就能夠理解成適配器在生活中的做用。

適配器模式包含三個角色:

  • 目標(Target)接口:當前系統業務所期待的接口,它能夠是抽象類或接口。
  • 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
  • 適配器(Adapter)類:它是一個轉換器,經過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。

這三種角色用筆記本電腦外接接口例子來講,HDMI接口是咱們的目標接口,由於咱們電腦提供功能是HDMI接口視頻輸出;VGA設備就是適配者,咱們最終須要把視頻輸出在VGA設備上;轉接頭就是咱們的適配器

適配器模式編碼實現

如今咱們有一個1.0版本商城場景,系統剛運行起來,咱們沒有自營商品,當前的商品都是第三方提供的,因此咱們商品下單時,要對接第三方下單服務:

// 第三方訂單服務
public class ThirdOrderService {
    // 調用該方法,實現第三方接口下單
    void thirdCreateOrder() {
        System.out.println("第三方服務接口下單");
    }
}
複製代碼

後面咱們商城系統發展起來了,對於商城的絕大部分商品,都變爲自營的了,後續商品的下單隻須要咱們調用本身的下單接口。

// 訂單服務接口
public interface OrderService {
    /**
     * 建立訂單接口
     */
    void createOrder();
}
複製代碼

可是,商城還有少部分是第三方提供的的商品,而咱們新的建立訂單接口並不兼容舊第三方接口。這時候,咱們就可使用適配器模式,使新的訂單接口兼容舊的第三方接口

// 第三方訂單接口適配器
public class ThirdOrderServiceAdapter implements OrderService {

    private ThirdOrderService thirdOrderService;

    public ThirdOrderServiceAdapter() {
        thirdOrderService = new ThirdOrderService();
    }

    @Override
    public void createOrder() {
        thirdOrderService.thirdCreateOrder();
    }
}
複製代碼

客戶端使用狀況

public class Client {
    public static void main(String[] args) {
        OrderService orderService = new ThirdOrderServiceAdapter();
        orderService.createOrder();
    }
}
// 輸出結果:
第三方服務接口下單
複製代碼

從客戶端調用來看,咱們經過第三方訂單接口適配器,使新的建立訂單接口兼容了舊的第三方接口調用。

對象適配器和類適配器

適配器模式通常有兩種不一樣的適配方法:對象適配和類適配。上面所演示的就是對象適配(經過組合方式)。接下來咱們看看類適配器,經過繼承方式實現。

public class ThirdOrderServiceAdapter2 extends ThirdOrderService implements OrderService {
    @Override
    public void createOrder() {
        // 調用父類的第三方訂單建立接口
        super.thirdCreateOrder();
    }
}
複製代碼

一般,咱們喜歡使用組合多於繼承,因此更經常使用的是對象適配方式。類適配方式違背了咱們的組合/聚合複用原則

相關文章
相關標籤/搜索