適配器模式是開發中經常會用到的模式,Android開發中經常用到的各種adapter就屬於適配器模式,連接各種數據庫時也要用到適配器模式。適配器模式在生活中的實例也隨處可見,你托人在日本買了個電飯煲,日本的市電電壓是110v,而國內的市電電壓是220v,這時你若想安全的使用電飯煲就必須裝一個220-110的變壓器,這個變壓器就可以理解成本模式中的適配器。
適配器模式有類的適配器模式和對象的適配器模式兩種不同的形式。首先看一下類的適配器模式UML類圖:
類的適配器模式
可以看到,目標接口中有方法1和方法2,而我們只有方法1,若想得到方法2,可以生成一個Adapter類。我們以上面講到的生活中的例子為例,實現以下代碼:
1.我們有的220v,也就是上圖中對應的Adaptee:
package com.adapter.demo;
public class Apply220V {
public int get220V(){
return 220;
}
}
2.想要110v,這里有個110v的接口:
package com.adapter.demo;public interface Apply110V {int get110v();}
3.我們想要110v電壓就要實現這個接口:
package com.adapter.demo;public class From220vTo110v extends Apply220V implements Apply110V {/** * 適配器 */@Overridepublic int get110v() {return 110;}}
設計模式的思想,增加這個中間的適配器可以使你的程序更靈活,更能多變。如果每次改需求你都有想殺人的沖動,說明你的程序沒有好的設計,也就是沒有用好設計模式,說明你要重構了。
這時編寫一個測試類:
package com.adapter.demo;public class TestClass {public static void main(String[] args) {From220vTo110v from220vTo110v=new From220vTo110v();System.out.println("輸出電壓:"+from220vTo110v.get110v());}}
運行如下:
對象的適配器模式
對象適配器模式不是使用繼承關系連接到Adaptee,而是使用代理模式連接到Adaptee類。UML類圖如下:
這里需要修改的是適配器類:
package com.adapter.demo;public class From220vTo110v implements Apply110V {/** * 適配器 */Apply220V apply220v;public From220vTo110v(Apply220V apply220v) {this.apply220v=apply220v;}public int getApply220v() {return apply220v.get220V();}@Overridepublic int get110v() {return 110;}}
測試類:
package com.adapter.demo;public class TestClass {public static void main(String[] args) {From220vTo110v from220vTo110v=new From220vTo110v(new Apply220V());System.out.println("輸出電壓:"+from220vTo110v.get110v());}}
運行如下:
我們可以看出:類適配器使用對象繼承的方式,是靜態的定義方式;而對象適配器使用對象組合的方式,是動態組合的方式。對象適配器更為靈活。
對於類適配器,適配器可以重定義Adaptee的部分行為,相當於子類覆蓋父類的部分實現方法。
對於對象適配器,要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類來實現重定義,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用於所有的源。
最后:
設計模式是手段,不是目的,設計模式可以幫我們更好地理解他人的代碼,同時也可以增加系統的可維護性、可擴展性、穩定性和靈活性。好的系統是需要設計的,設計模式就好像一個高手的內功一樣,是需要修煉,需要融會貫通的。
學習設計模式的道路注定是抽象的、枯燥的,量變產生質變,也許堅持一下走過這個山口,下一個山口就是目的地了。
喜歡的朋友關注我和我的公眾號。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。