公號:碼農充電站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
方法,也就是小明不用學會開汽車,也能用騎自行車的方式開汽車,我們構造了一個 CarAdapter
,CarAdapter
繼承了 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,總結
也許你已經看出來了,其實適配器模式也是一種裝飾對象的方式,就像裝飾者模式一樣。它們不同點是:
- 適配器模式的主要目的是解決接口的不兼容問題。
- 裝飾者模式的主要目的是增強原有對象的行為。
所以,這兩種模式的設計意圖是不同的。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術干貨。