Java與設計模式-適配器模式


     適配器模式是開發中經常會用到的模式,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的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用於所有的源。

 

 

最后:

設計模式是手段,不是目的,設計模式可以幫我們更好地理解他人的代碼,同時也可以增加系統的可維護性、可擴展性、穩定性和靈活性。好的系統是需要設計的,設計模式就好像一個高手的內功一樣,是需要修煉,需要融會貫通的。

學習設計模式的道路注定是抽象的、枯燥的,量變產生質變,也許堅持一下走過這個山口,下一個山口就是目的地了。

 

喜歡的朋友關注我和我的公眾號。


 


 

 

  


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com