介面卡模式-讓不相容的介面得以適配

碼農充電站發表於2021-01-04

公號:碼農充電站pro
主頁:https://codeshellme.github.io

本篇來介紹介面卡模式Adapter Design Pattern),它可以將兩個不相容的介面變得相容,而不需改變原有程式碼。

1,生活中的介面卡

生活中有很多常用的介面卡,比如介面轉換器電源轉換器

介面轉換器可以將兩個不匹配的多媒體介面變得匹配;電源轉換器可以將兩個不匹配的插頭和插座變得匹配。

在這裡插入圖片描述

我們可以將介面卡的作用抽象成下面的圖。下圖中的兩個系統是不相容的:

在這裡插入圖片描述

這時可以建立一個介面卡:

在這裡插入圖片描述

經過這個介面卡,可以將兩個不相容的系統相容在一起:

在這裡插入圖片描述

介面卡的好處在於,它並沒有修改原來的系統,而是再建立一個新的元件來達到我們的需求。

2,介面卡模式

介面卡模式將一個類的介面轉換成客戶期望的另一個介面,使得原本介面不相容的類可以相互合作

介面卡模式可以分為物件介面卡類介面卡兩種,每種介面卡中都有四個重要的元件:

  • Client:客戶,只認識目標介面。
  • Target:目標介面。
  • Adapter:介面卡。
  • Adaptee:被適配者。

介面卡將被適配者轉換成目標介面,以供客戶使用。

物件介面卡使用組合的方式,其類圖如下:

在這裡插入圖片描述

因為物件介面卡使用組合的方式實現,所以,對於 Adaptee 的所有子類,Adapter 都可以進行適配。

類介面卡使用多繼承的方式,其類圖如下:

在這裡插入圖片描述

3,介面卡模式舉例

下面列舉一個物件介面卡的例子,來體會一下如何使用介面卡模式。

假如,我們有一個汽車類和一個自行車類

interface BicycleInterface {
    void ride();
}

class Bicycle implements BicycleInterface {
    public void ride() {
        System.out.println("I am riding a bicycle.");
    }
}

interface CarInterface {
    void drive();
}

class Car implements CarInterface {
    public void drive() {
        System.out.println("I am driving a car.");
    }
}

小明只會騎自行車而不會開汽車:

public class Adapter {

    // 小明只會騎自行車
    public static void xiaoMing(BicycleInterface b) {
        b.ride();
    }

    public static void main(String[] args) {
        Bicycle b = new Bicycle();
        Car c = new Car();
        
        xiaoMing(b);    // I am riding a bicycle.
        // xiaoMing(c); // 型別不匹配,不會開汽車
    }
}

為了不改變 xiaoMing 方法,也就是小明不用學會開汽車,也能用騎自行車的方式開汽車,我們構造了一個 CarAdapterCarAdapter 繼承了 BicycleInterface 介面,如下:

class CarAdapter implements BicycleInterface {
    private CarInterface car;

    public CarAdapter(CarInterface car) {
        this.car = car;
    }

    public void ride() {
        car.drive();
    }
}

CarAdapter 可以將 Car 適配成 Bicycle,這樣小明在 CarAdapter 的幫助下也能開汽車了:

CarAdapter ca = new CarAdapter(c); // 將 Car 適配成 Bicycle
xiaoMing(ca); // 小明可以開汽車了

我將完整的程式碼放在了這裡,供大家參考。

4,總結

也許你已經看出來了,其實介面卡模式也是一種裝飾物件的方式,就像裝飾者模式一樣。它們不同點是:

  • 介面卡模式的主要目的是解決介面的不相容問題
  • 裝飾者模式的主要目的是增強原有物件的行為

所以,這兩種模式的設計意圖是不同的。

(本節完。)


推薦閱讀:

工廠模式-將物件的建立封裝起來

策略模式-定義一個演算法族

觀察者模式-將訊息通知給觀察者

裝飾者模式-動態的包裝原有物件的行為

命令模式-將請求封裝成物件


歡迎關注作者公眾號,獲取更多技術乾貨。

碼農充電站pro

相關文章