Java程序設計模式系列之適配器模式

理解適配器設計模式需要從生活中的場景進行聯繫,在生活當中有那些東西能夠稱爲適配器呢?從字面上理解,“適配”的意思就是讓一個東西和另一個東西配對,能夠讓他們一起工作,比如大家用的筆記本電腦就需要用到電源適配器,轉換插口和電流到筆記本上給筆記本電腦進行供電。再比如在國內所有的電器插座都是兩口或三口的國內標準插座,但如果到中國大陸以外的地區旅行,想要使用電源給電子產品供電,就需要轉換插口了。比如王老師到了香港,看到的電源插座是這樣的:



很明顯,從國內帶去的手機就無法充電了。


那麼這個問題怎麼解決呢?



經過查找資料,王老師找到了一種產品,它就是長成這個樣子的東東,叫“電源適器”。



用法相信大家一看就清楚了。



有個它,媽媽再也不用擔心我擔心我沒有電了。



“哦!我知道了,這不是個轉換口嗎?”是的,其實跟讀卡器的概念是一樣的,就是將原本不能用的接口經過適配器轉換成能用的接口。



概念:



適配器模式(Adapter):將一個類的接口,轉換成客戶希望的另一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。



“還是沒讀懂!”不要緊,下面簡單易懂的案例+代碼,讓你明白什麼是適配器模式。


接下來我們就以電源這個案例來介紹適配器模式:


這裏有兩個不兼容的接口,電源A接口和電源B接口,並且有各自相應的實現方法。代碼如下:


那麼兩個接口應該有各自的實現類,代碼如下:


接下來就應該是客戶端來調用了,先定義電源A開始工作方法:


那麼想要調用start方法就需要傳入PowerA的實現類對象了。



所以這裏我們創建一個PowerAImpl對象,並且調用start方法。


編譯後運行的結果是這樣滴:


我們這裏已經寫好了,如果這時我們想傳PowerB接口到start方法可以嗎?怎麼辦呢?



那麼此時我們有兩種辦法來實現,第一種:


再添加一個startB方法,但這不是一個好的解決方案,因爲在startA中調用insert方法的前後我們可能存在一些邏輯以及業務,同樣的在startB中調用connect方法的前後可能存在這些相同的邏輯及業務,就只有connect方法調用這一句不同,那麼重寫一份就是多餘的了,代碼重複了。不太符合我們面向對象的編程思想,怎麼辦呢?往下看。


接下來看第二種解決方案:我們還是想用一個start方法解決這個問題,到這裏會有人想到直接把start方法改成適應兩個接口的,王老師在此處需要先給大家說明一個問題了,面向對象的編程原則中有一點非常重要的是“對修改關閉,對擴展開放”,如果我們的程序已經上線運行,當時並沒有考慮要傳PowerB接口進來,只傳PowerA接口就好了,但現在業務修改要求也可以傳PowerB接口,那麼修改方法將對其他已寫好的程序造成怎樣的影響也是未知的,可能其他小夥伴調用了你的start方法就會出問題了,也就是說調用了你的start方法的代碼都會有連鎖反應了。OK!看下面!



我們需要實現這樣的東東。



很顯然這樣的代碼編譯是不會通過的,因爲目前PowerA和PowerB本來就是兩個不同的接口,相當於一個三口的插座和一個兩口的根本插不進入是一樣的。



要想實現轉換,現在需要適配器啦!我們需要把PowerB轉換成PowerA傳進來,那麼我們就給PowerA做一個適配器。



1、首先要適配的是PowerA,所以實現PowerA接口,那麼PowerAAdapter就可以作爲PowerA的實現類傳進start方法了。



2、我們是要用這個適配器將PowerB轉成PowerA,那麼就需要和PowerB取得聯繫,所以定義一個PowerB作爲屬性,並通過構造方法進行初始化操作。



3、實現了PowerA接口需要重寫其方法,那麼在重寫的insert方法中調用PowerB的connect方法,適配器就寫好了。



現在來測試一下:



編譯之後運行結果是這樣滴:



結果說明PowerB接口的實現類開始工作了,但傳參數的時候是通過PowerA接口的形式傳進來進行工作的。這就是神奇的適配器模式啦!



按照步驟敲一敲代碼!更有助於理解!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章