適配器模式-讓不兼容的接口得以適配

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

本篇來介紹適配器模式Adapter Design Pattern),它能夠將兩個不兼容的接口變得兼容,而不需改變原有代碼。java

1,生活中的適配器

生活中有不少經常使用的適配器,好比接口轉換器電源轉換器git

接口轉換器能夠將兩個不匹配的多媒體接口變得匹配;電源轉換器能夠將兩個不匹配的插頭和插座變得匹配。github

在這裏插入圖片描述

咱們能夠將適配器的做用抽象成下面的圖。下圖中的兩個系統是不兼容的:算法

在這裏插入圖片描述

這時能夠建立一個適配器:shell

在這裏插入圖片描述

通過這個適配器,能夠將兩個不兼容的系統兼容在一塊兒:ide

在這裏插入圖片描述

適配器的好處在於,它並無修改原來的系統,而是再建立一個新的組件來達到咱們的需求。this

2,適配器模式

適配器模式將一個類的接口轉換成客戶指望的另外一個接口,使得本來接口不兼容的類能夠相互合做設計

適配器模式能夠分爲對象適配器類適配器兩種,每種適配器中都有四個重要的組件:code

  • 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

相關文章
相關標籤/搜索