1. 程式人生 > >介面卡模式-讓不相容的介面得以適配

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

> **公號:碼農充電站pro** > **主頁:** 本篇來介紹**介面卡模式**(*Adapter Design Pattern*),它可以將兩個不相容的介面變得相容,而不需改變原有程式碼。 ### 1,生活中的介面卡 生活中有很多常用的介面卡,比如**介面轉換器**和**電源轉換器**。 介面轉換器可以將兩個不匹配的多媒體介面變得匹配;電源轉換器可以將兩個不匹配的插頭和插座變得匹配。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231100102698.png?) 我們可以將介面卡的作用抽象成下面的圖。下圖中的兩個系統是不相容的: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231112018629.png?) 這時可以建立一個介面卡: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231112055788.png) 經過這個介面卡,可以將兩個不相容的系統相容在一起: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231112117302.png?) 介面卡的好處在於,它並沒有修改原來的系統,而是再建立一個新的元件來達到我們的需求。 ### 2,介面卡模式 **介面卡模式將一個類的介面轉換成客戶期望的另一個介面,使得原本介面不相容的類可以相互合作**。 介面卡模式可以分為**物件介面卡**和**類介面卡**兩種,每種介面卡中都有四個重要的元件: - **Client**:客戶,只認識目標介面。 - **Target**:目標介面。 - **Adapter**:介面卡。 - **Adaptee**:被適配者。 介面卡將被適配者轉換成目標介面,以供客戶使用。 **物件介面卡使用組合的方式**,其類圖如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231155732353.png?) 因為物件介面卡使用組合的方式實現,所以,對於 **Adaptee** 的所有子類,**Adapter** 都可以進行適配。 **類介面卡使用多繼承的方式**,其類圖如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231155932399.png?) ### 3,介面卡模式舉例 下面列舉一個物件介面卡的例子,來體會一下如何使用介面卡模式。 假如,我們有一個**汽車類**和一個**自行車類**: ```java 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."); } } ``` 小明只會騎自行車而不會開汽車: ```java 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` 方法,也就是小明不用學會開汽車,也能用騎自行車的方式開汽車,我們構造了一個 `CarAdapter` ,`CarAdapter` 繼承了 `BicycleInterface ` 介面,如下: ```java class CarAdapter implements BicycleInterface { private CarInterface car; public CarAdapter(CarInterface car) { this.car = car; } public void ride() { car.drive(); } } ``` `CarAdapter` 可以將 `Car` 適配成 `Bicycle`,這樣小明在 `CarAdapter` 的幫助下也能開汽車了: ```java CarAdapter ca = new CarAdapter(c); // 將 Car 適配成 Bicycle xiaoMing(ca); // 小明可以開汽車了 ``` 我將完整的程式碼放在了[這裡](https://github.com/codeshellme/codeshellme.github.io/blob/master/somecode/dp/Adapter.java),供大家參考。 ### 4,總結 也許你已經看出來了,其實介面卡模式也是一種裝飾物件的方式,就像[裝飾者模式](https://www.cnblogs.com/codeshell/p/14210116.html)一樣。它們不同點是: - 介面卡模式的主要目的是解決介面的**不相容問題**。 - 裝飾者模式的主要目的是**增強原有物件的行為**。 所以,這兩種模式的設計意圖是不同的。 (本節完。) --- **推薦閱讀:** [工廠模式-將物件的建立封裝起來](https://www.cnblogs.com/codeshell/p/14187677.html) [策略模式-定義一個演算法族](https://www.cnblogs.com/codeshell/p/14200531.html) [觀察者模式-將訊息通知給觀察者](https://www.cnblogs.com/codeshell/p/14205145.html) [裝飾者模式-動態的包裝原有物件的行為](https://www.cnblogs.com/codeshell/p/14210116.html) [命令模式-將請求封裝成物件](https://www.cnblogs.com/codeshell/p/14214705.html) --- *歡迎關注作者公眾號,獲取更多技術乾貨。* ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic