Java设计模式之Adapter模式
一、概述:
提到Adapter適配器相信很多人都特別熟悉了,在我們開發中經常出現一些實現繼承適配器去完成某項功能,使用最多的可能就是ListView和RecyclerView的是適配器了,不知道有沒有同學想過適配器的作用呢?為什么要使用這些適配器?以及他們所帶來的好處呢?
下面我們舉個例子:如果你去了某個地方,準備要給你的手機充電,發現整個房間的都是三孔插座,而你的手機充電器只能使用兩空,這時你會去前臺尋求幫助,前臺可能會給你一個帶有兩空的插板,這時你回去把插板插在房間的三孔插座你的手機就可以充電了,我們來分析下這個過程,:
- 需求:兩孔充電插座
- 條件:三孔電源插座
- 解決方法:插線板
上述過程使用了插線板將三孔插座抓還為兩孔充電,插線板起到了將三孔插座電源適配給兩孔充電器的功能,也就是Adapter的功能。在程序中將這種用于填補“現有程序”和“所需程序”之間差異的設計模式叫Adapter(適配器)模式。
Adapter模式分為兩種:
- 類適配器:需要繼承類來實現
- 對象適配器:需要委托對象實現
下面我們分別來介紹若何實現這兩個適配器:
二、類適配器
假設現在需要12伏的電壓,可是只提供100V的電壓輸出,需要采用適配器來轉換為12V,我們按照上面的例子分析這個問題:
- 需求:12V電壓
- 條件:100V電壓
- 適配器:100V轉換為12V
現在我們將上述需求和條件轉換為想用的代碼實現:
需求接口獲得12V的電壓:
interface ElegantTwenty {fun getElegantT(): Int }創建ElegantHundreds類,提供100V電壓:
open class ElegantHundreds {private val elegant: Int = 10fun getEle(): Int {return elegant * 10} }為了能將提供的100V電壓轉化為所需的12V,我們提供一個電壓適配器ElegantAdapter用于電壓轉換,為了能獲取提供的電壓,我們讓ElegantAdapter繼承ElegantHundreds,并實現需求的接口,提供需求方法,這里做一個簡單的處理將電壓降低88V:
class ElegantAdapter : ElegantHundreds(),ElegantTwenty {override fun getElegantT(): Int {var ele = getEle()return ele - 88} }現在我們去獲取電壓,看看能不能獲取到所需的12V電壓:
var elegantTwenty: ElegantTwenty = ElegantAdapter()var elegant = elegantTwenty.getElegantT()tvElegant.text = "ElegantAdapter 獲取的電壓為 ${elegant}V"輸出的電壓為:
此時已經使用適配器將電壓轉換為12V了,相信適配器的作用大家都了解了,就是創建一個具體類繼承原有功能并實現需求接口,從而達到兩者轉換的目的,但可能會有同學說如果需求不是接口呢?那根據Java的單繼承關系就不能實現上面的關系了,那該怎么辦呢?這種情況就是上面所說的第二種委托式的適配器。
三、對象適配器
現在我們將上面的需求接口ElegantTwenty改成類:
abstract class ElegantTwenty {abstract fun getElegant12():Int }在適配繼承需求類ElegantTwenty后,就無法繼承ElegantHundreds,所以可以在適配器中創建ElegantHundreds的對象,將所有的相關操作委托給創建的對象操作:
class Adapter : ElegantTwenty(){ //創建一個ElegantHundreds的對象作為委托對象private val elegant by lazy {ElegantHundreds()}override fun getElegant12(): Int {return elegant.getEle() - 88} }現在去獲取12V電壓的方法中會先委托對象拿去提供的100V電壓,然后轉化為12V,現在我們去獲取電壓:
var elegant12 : ElegantTwenty = Adapter()var v = elegant12.getElegant12()textView.text = "ElegantAdapter 獲取的電壓為 ${v}V"四、登場角色
到這兩種適配器的使用方式都介紹完了,這里只是用簡單的實例演示具體的使用方法,下面我們來看看Adapter的登場角色
- Target:定義需求方法(如:ElegantTwenty)
- Client:具體的請求者(如:MainActivity等使用的地方)
- Adaptee:被適配的角色,通常為一個持有既定方法的角色(如:ElegantHundreds)
- Adapter:適配器,對Adaptee角色和Target之間的轉換(如:ElegantAdapter)
在類適配其中,Adapter通過繼承Adaptee,而在對象適配其中Adapter中持有Adaptee對象,通過對象委托實現。
五、使用場景
既然學會了Adapter的使用,那我們在什么情況下選擇使用Adapter模式呢?
- 擴展代碼適應性。對已有的經過測試封裝好的代碼,這樣的代碼往往不要輕易的修改,但為了適用于不同的項目和條件,這時就要使用適配器進行適配處理
- 避免更多的修改。當我們寫好一個需求后當需求發生一點改變時,很多同學會認為我修改一個某段的代碼就可以,可是修改后發現牽一發而動全身,這時就可以使用Adapter模式避免修改問題的發生
- 版本升級和兼容。假設在版本不斷升級時某一個地方的功能有了新的實現,可是要適配之前的版本,為了避免每次都要同時修改心就版本,可以采用適配模式讓舊版本適配新程序,以后只要對新程序的維護。
- 聯系功能完全不同的兩個類。通過適配器讓兩者聯系起來實現某種需求。
今天適配模式的介紹就到這里了,周末結束了,又是新的一周繼續努力!
總結
以上是生活随笔為你收集整理的Java设计模式之Adapter模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python ffmpeg直播_pyth
- 下一篇: 厦门市大专计算机学校有哪些,2021厦门