公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
本篇來介紹適配器模式(Adapter Design Pattern),它能夠將兩個不兼容的接口變得兼容,而不需改變原有代碼。java
生活中有不少經常使用的適配器,好比接口轉換器和電源轉換器。git
接口轉換器能夠將兩個不匹配的多媒體接口變得匹配;電源轉換器能夠將兩個不匹配的插頭和插座變得匹配。github
咱們能夠將適配器的做用抽象成下面的圖。下圖中的兩個系統是不兼容的:算法
這時能夠建立一個適配器:shell
通過這個適配器,能夠將兩個不兼容的系統兼容在一塊兒:ide
適配器的好處在於,它並無修改原來的系統,而是再建立一個新的組件來達到咱們的需求。this
適配器模式將一個類的接口轉換成客戶指望的另外一個接口,使得本來接口不兼容的類能夠相互合做。設計
適配器模式能夠分爲對象適配器和類適配器兩種,每種適配器中都有四個重要的組件:code
適配器將被適配者轉換成目標接口,以供客戶使用。
對象適配器使用組合的方式,其類圖以下:
由於對象適配器使用組合的方式實現,因此,對於 Adaptee 的全部子類,Adapter 均可以進行適配。
類適配器使用多繼承的方式,其類圖以下:
下面列舉一個對象適配器的例子,來體會一下如何使用適配器模式。
假如,咱們有一個汽車類和一個自行車類:
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); // 小明能夠開汽車了
我將完整的代碼放在了這裏,供你們參考。
也許你已經看出來了,其實適配器模式也是一種裝飾對象的方式,就像裝飾者模式同樣。它們不一樣點是:
因此,這兩種模式的設計意圖是不一樣的。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。