說道JAVA中的適配器模式,不得不引用該設計模式的固定表述“適配器模式(Adapter ):將一個類的接口轉換成客戶希望的另外一個接口,適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作”。該模式其實類似於90年代那會的穩壓器,當時的電壓沒有現在這樣穩定,看電視的時候經常會出現閃屏的現象,為此爺爺專門通過工作關系渠道搞到全村第一台穩壓器(見下圖,哎老爺子拍照之前也不說弄弄干淨,大伙湊合看下),從起開啟了童年裡幸福的觀影時光。
現在21世紀了,除了老舊的穩壓器外,各種各樣的適配器已經是隨處可見了(各種手機充電適配器,電腦電源適配器等等),這裡為了方便大家理解,我們用做常用的電腦電源適配器來講解今天的設計模式,首先要明確的是在這整個過程中我們只有三個具體的對象,分別是電源(插座)、適配器,電腦(電池)。下來我們開始撸代碼:
1 /*首先我們需要建立一個電源(插板)的接口,並提供對應方法 2 * (之所用接口是為了方便適配器實現) 3 */ 4 interface Power{ 5 public void electric(); 6 } 7 //首先我們需要建立一個電腦的接口,並提供對應方法 8 interface Computer{ 9 public void battery(); 10 } 11 //建立分別實現兩個接口的類 12 class PowerImpl implements Power{ 13 @Override 14 public void electric() { 15 System.out.println("我有電"); 16 } 17 } 18 class ComputerImpl implements Computer{ 19 @Override 20 public void battery() { 21 System.out.println("我有電池"); 22 } 23 } 24 /* 25 * 建造適配器(這裡我個人認為作為適配器,應該同時實現他所連接的兩個接口 26 * ,在這裡就是電源和電腦的接口) 27 */ 28 class Adapter implements Power,Computer{ 29 /*適配器中聲明名兩個接口,並分別建立構造方法 30 * (適配器中應該有支持兩種接口的模塊) 31 */ 32 Power power; 33 Computer computer; 34 35 public Adapter(Power power) { 36 super(); 37 this.power = power; 38 } 39 public Adapter(Computer computer) { 40 super(); 41 this.computer = computer; 42 } 43 /*適配器核心代碼: 44 * 可以理解為要實現電腦電池充電的方法,就必須調用電源的電方法。 45 * 同理在這個過程中電源的電要實現自身價值,就必須調用電腦的電池。 46 */ 47 @Override 48 public void battery() { 49 power.electric(); 50 } 51 @Override 52 public void electric() { 53 computer.battery(); 54 } 55 }
測試類一:這裡模擬在有電的情況下(即適配器一端已經連接電源插板),通過適配器調用電腦電池的過程
public class AdapterDemo { public static void main(String[] args) { Computer computer = new ComputerImpl();//實例化Computer(父類引用指向子類對象) Adapter a = new Adapter(computer);//實例化適配器,可以理解為將另外一端連接到電腦的過程 method(a); } //靜態方法(已經提供了電) public static void method(Power p){ p.electric(); } }
輸出結果:
1 我有電池
測試類二:這裡模擬在有電腦(電池)的情況下(即適配器一端已經連接電腦),通過適配器調用power的過程
1 public class AdapterDemo1 { 2 public static void main(String[] args) { 3 Power power = new PowerImpl();//實例化Power(父類引用指向子類對象) 4 Adapter a = new Adapter(power); 5 method(a); 6 } 7 //靜態方法(已經提供了電腦) 8 public static void method(Computer c){ 9 c.battery(); 10 } 11 }
輸出結果:
1 我有電
這裡寫的比較規矩,方便初學者理解,大家也可以通過匿名內部類來簡化(優化)這段代碼,祝大伙撸的開心。