今天看了部特工電影,裏面有個橋段,主角在直升機上和反派生死搏鬥,而飛機則是無人駕駛的狀態,有墜毀的危險。生死存亡,危急時刻主角讓團隊成員去駕駛,而團隊成員很慌張地說:「Hey, man,你開什麼國際玩笑,我只拿到了汽車的駕照,飛機駕照我可沒有?…」,主角則在遠處淡定的說:「那你就當它是汽車好了」。如何讓一個開汽車的人去駕駛直升機呢?java
什麼是適配器模式?設計模式
GoF中的定義:網絡
將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。架構
通俗來說就是,咱們項目中原來已經有一個接口(Adaptee)了它具備某類特定功能,如今需求升級新增長了一個接口(Target)具備了新功能,如何保證客戶端某個「現存對象」具備兩個接口的功能呢?ide
也許會說,咱們能夠將Target接口的功能copy到Adaptee接口或者同時實現以上兩個接口,先不說這違反了咱們的設計模式六大原則中的開閉原則和接口隔離原則,這會形成咱們須要修改實現了Adaptee接口的全部實現類,Override全部新的功能的實現,若是實現類少還能夠,而若是實現類不少,那麼這個工做量無疑是巨大並且痛苦的。測試
因此,適配器模式不是爲新項目架構設計時而添加的,而是解決正在服役項目因爲功能升級而致使接口不兼容問題而提出的。this
適配器模式包含以下角色:架構設計
適配器模式有對象適配器和類適配器兩種實現:設計
對象適配器:
code
類適配器:
駕駛汽車接口
public interface Car { void drive(); }
駕駛直升機接口
public interface Helicopter { void air(); }
駕駛汽車的特工接口實現:
public class Agent implements Car { @Override public void drive() { System.out.println("特工開着汽車,啦啦啦。"); } }
1.類適配器實現
public class ClassAdapter extends Agent implements Helicopter { @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } }
亦能夠這樣寫(不推薦):
public class ClassAdapter implements Car,Helicopter { @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } @Override public void drive() { System.out.println("特工開着汽車,啦啦啦。"); } }
2.對象適配器實現
public class ObjectAdapter implements Helicopter{ private Agent agent; public ObjectAdapter(Agent agent) { this.agent = agent; } public void drive(){ this.agent.drive(); } @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } }
3.測試demo類
public class AdapterMain { public static void main(String[] args) { System.out.println("---------初始特工----------"); Agent agent = new Agent(); agent.drive(); System.out.println("---------對象適配器特工----------"); ClassAdapter adapter = new ClassAdapter(); adapter.air(); adapter.drive(); System.out.println("---------類適配器特工----------"); ObjectAdapter classAdapter = new ObjectAdapter(agent); classAdapter.drive(); classAdapter.air(); } }
運行結果
---------初始特工---------- 特工開着汽車,啦啦啦。 ---------對象適配器特工---------- 特工駕駛者飛機,呼呼呼。 特工開着汽車,啦啦啦。 ---------類適配器特工---------- 特工開着汽車,啦啦啦。 特工駕駛者飛機,呼呼呼。
類適配器模式:
因爲適配器類是適配者類的子類,所以能夠在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
對象適配器模式:
一個對象適配器能夠把多個不一樣的適配者適配到同一個目標,也就是說,同一個適配器能夠把適配者類和它的子類都適配到目標接口。
類適配器和對象適配器的區別是:類適配器是繼承Adaptee類(接口實現類),而對象適配器是依賴Adaptee類,持有Adaptee的類對象。
使用適配器模式時