作者簡介? 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog
本篇來自再看就點爆的投稿耀石,通過實際項目給大家分析了適配器模式遵班,希望對大家有所幫助寥掐。
再看就點爆的博客地址:
http://blog.csdn.net/u010618194
前言
適配器:Adapter最岗,大家看到這個單詞是不是非常眼熟了蛔六?沒錯,這就是我們平時用到 ListView 和 RecyclerView 時必定會配合使用的 Adapter废亭。列表顯示數據幾乎是任何一個安卓項目都會用到的一個功能国章,谷歌使用適配器模式來封裝等使之異常靈活且非常實用,我們想要了解谷歌為什么這樣做豆村,就要先理解Java適配器模式是怎樣運作的液兽,這篇文章我們就學習一下java設計模式之一的適配器模式以及它在安卓中的應用。
適配器模式
使用場景:適配器模式把一個類的接口變換成客戶端所期待的另一種接口掌动,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作四啰。
引用網上的一個例子:筆記本電腦電源一般用的都是5V電壓,但是我們的家用電是220V粗恢,我們要讓筆記本充上電柑晒,最好的辦法應該是通過一個工具把220V的電壓轉換成5V,這個工具就是適配器
好好理解一下設計模式的使用場景比起去記住代碼是怎樣寫的效果要好很多眷射,說不定你哪天編碼的時候靈光一現用上了匙赞,那就是你真正掌握了佛掖。
適配器模式的種類
1. 類適配器
UML圖(強烈建議大家去了解一下UML圖,它很簡單粗暴的把類與類之間的關系描述的很清楚易懂)
我們可以看到涌庭,目標接口 Target 就相當于是上面的5V電壓芥被,Adaptee 就是被適配的220V電壓,Adapter 就是適配器坐榆∷┢牵看代碼:
輸出結果:
充5V電啦
充220V電啦
結合上面給點UML圖稍微分析一下:
Adapter類 繼承了 Adaptee220V類 然后實現了接口 Target5V 并實現了目標方法 chong5V(),類適配器的一個特點就是 Adapter 會去繼承被適配類席镀,這樣適配器就直接擁有了被適配類中的方法匹中,所以類適配器的缺點就是不夠靈活,讓我們看一下另外一種適配器愉昆。
2. 對象適配器
UML圖
這里的 Target 依然是 5V電壓职员,Adaptee 依然是 220V電壓,比起類適配器跛溉,Adapter 和 Adaptee 的關系從繼承變成了組合焊切,上代碼:
輸出結果:
充5V電啦
充220V電啦
這里我們把 Adaptee220V 通過 Adapter 的構造方法傳入到 Adapter 中,當調用 Adapter 的 chong220V()方法 時芳室,實際是調用傳進來 Adaptee220V 對象的 chong220V 方法专肪,這樣就會變得很靈活。
項目中的運用
之所以寫這篇關于適配器設計模式的文章堪侯,是因為作者在以前有一次實際開發(fā)中嚎尤,在沒有學習過適配器模式的前提下,為了解決項目中的一個開發(fā)痛點伍宦,自己費勁腦筋想出來的一種模式芽死,到現在才知道原來這個叫適配器模式,在學習了這個設計模式之后更加深入了解了一下次洼。接下來关贵,就來演示一下作者在實際工作中使用到的變異形態(tài)的對象適配器模式。
當時開發(fā)場景:當時作者開發(fā)一個基于POS機的APP卖毁,APP要求有打印功能揖曾,像訂單打印、日期打印等等亥啦。我們知道POS機是有多種型號的炭剪,每種型號的POS機會有他們單獨的SDK,也就是說打印方法是不同的翔脱!
首先奴拦,我們每次調用打印的時候都會先判斷 POS機 型號,因為型號不對程序肯定會報錯届吁,假如某一天粱坤,APP適配的 POS機 類型要增加一款隶糕,也就是說我每個判斷 POS機 型號的地方都要多家一個if語句,并且還要把 新POS機型 的打印方法加上去站玄,如果我有5個地方用到了打印枚驻,就要加5次,這樣是很痛苦的株旷,別問我為什么知道再登。。晾剖。經過2次這樣的真實情況發(fā)生后锉矢,我暴走了,痛定思痛要想個辦法結局齿尽,于是有了以下代碼:
每種?POS機 都實現 IPrint 中的打印方法:
這里我把?POS機 型號判斷的代碼放到了 PrintManager 的構造方法中沽损,每次new出實例時就會去判斷。然后我讓 PrintManager 也實現了IPrint接口循头,因為我認為項目中的打印管理類必須要擁有這三種打印方法绵估。
發(fā)現沒,改過之后的代碼卡骂,在不同的調用的地方再也不用擔心新增POS機型需要改代碼了国裳,只需要在 PrintManager 的構造方法中增加一個判斷就好了。要是改成單例:
改完之后我哭了全跨。缝左。。我他嗎的是個天才啊浓若。渺杉。。后面果然加了多款POS機挪钓,但是我再也不痛苦了是越!看一下我的UML圖:
其實,光看UML圖诵原,作者在項目中的這種寫法已經不算是適配器模式了英妓,因為 Adaptee 已經直接實現了Target中的方法挽放,也就是說根本就不存在不滿足目標接口這個說法了绍赛。。不過作者這樣寫完全是自己想出來的辑畦,沒有基于任何設計模式吗蚌,就現在目前的效果來說還是不錯的,通過這篇文章纯出,我對于適配器模式有了一個清晰的理解蚯妇,同時也反思了一下我這種寫法敷燎,還是很有收獲的。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》