第9章 適配器設(shè)計(jì)模式
內(nèi)容來(lái)自尚硅谷Java設(shè)計(jì)模式(圖解+框架源碼剖析)_嗶哩嗶哩_bilibili
寫(xiě)在前面:本文內(nèi)容大致和原視頻內(nèi)老師的筆記內(nèi)容相同,會(huì)偶爾插入自己的注釋和理解,盡量會(huì)完成作業(yè)
SpringMVC還沒(méi)學(xué),這一章后面有SpringMVC的源碼分析,看過(guò)了一遍,決定等框架學(xué)完回來(lái)補(bǔ)上,接下來(lái)的學(xué)習(xí)進(jìn)度要加快了不能再慢慢的全學(xué)了,根據(jù)水哥和魚(yú)皮哥的路線(xiàn)圖盡快把重要知識(shí)點(diǎn)學(xué)習(xí),能參加工作就盡早。
9.1現(xiàn)實(shí)生活中的適配器例子
泰國(guó)插座用的是兩孔的(歐標(biāo)),可以買(mǎi)個(gè)多功能轉(zhuǎn)換插頭(適配器),這樣就可以使用了。

9.2基本介紹
1.????? 適配器模式(Adapter Pattern)將某個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)端期望的另一個(gè)接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個(gè)類(lèi)可以協(xié)同工作。其別名為包裝器(Wrapper)
2.????? 適配器模式屬于結(jié)構(gòu)型模式
3.????? 主要分為三類(lèi):類(lèi)適配器模式、對(duì)象適配器模式、接口適配器模式
9.3工作原理
1)????? 適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成另一種接口.讓原本接口不兼容的類(lèi)可以兼容
2)????? 從用戶(hù)的角度看不到被適配者,是解耦的
3)????? 用戶(hù)調(diào)用適配器轉(zhuǎn)化出來(lái)的目標(biāo)接口方法,適配器再調(diào)用被適配者的相關(guān)接口方法
4)????? 用戶(hù)收到反饋結(jié)果,感覺(jué)只是和目標(biāo)接口交互,如圖

9.4類(lèi)適配器模式
9.4.1類(lèi)適配器基本介紹
基本介紹: Adapter類(lèi),通過(guò)繼承src類(lèi),實(shí)現(xiàn)dst類(lèi)接口,完成src->dst的適配。
9.4.2類(lèi)適配器模式應(yīng)用實(shí)例
1)????? 應(yīng)用實(shí)例說(shuō)明
以生活中充電器的例子來(lái)講解適配器,充電器本身相當(dāng)于Adapter,220V交流電相當(dāng)于src(即被適配者),我們的目dst(即目標(biāo))是5V直流電
2)????? 思路分析(類(lèi)圖)

3)????? 代碼實(shí)現(xiàn)
9.4.3類(lèi)適配器模式注意事項(xiàng)和細(xì)節(jié)
1)????? Java 是單繼承機(jī)制,所以類(lèi)適配器需要繼承src類(lèi)這一點(diǎn)算是一個(gè)缺點(diǎn),因?yàn)檫@要求dst必須是接口,有一定局限性;
2)????? src類(lèi)的方法在Adapter中都會(huì)暴露出來(lái),也增加了使用的成本。
3)????? 由于其繼承了src類(lèi),所以它可以根據(jù)需求重寫(xiě)src類(lèi)的方法,使得Adapter的靈活性增強(qiáng)了。
9.5對(duì)象適配器
9.5.1對(duì)象適配器介紹
1)????? 基本思路和類(lèi)的適配器模式相同,只是將Adapter類(lèi)作修改,不是繼承src類(lèi),而是持有src類(lèi)的實(shí)例,以解決兼容性的問(wèn)題。即:持有src類(lèi),實(shí)現(xiàn)dst類(lèi)接口,完成src->dst的適配
2)????? 根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系(聚合)來(lái)替代繼承關(guān)系。
3)????? 對(duì)象適配器模式是適配器模式常用的一種
9.5.2應(yīng)用實(shí)例說(shuō)明
1)????? 以生活中充電器的例子來(lái)講解適配器,充電器本身相當(dāng)于Adapter,220V交流電相當(dāng)于src(即被適配者),我們的目dst(即目標(biāo))是5V直流電
2)????? 思路分析(類(lèi)圖):只需要修改適配器類(lèi)即可

3)????? 代碼實(shí)現(xiàn)
9.5.3對(duì)象適配器模式的注意事項(xiàng)和細(xì)節(jié)
1)????? 對(duì)象適配器和類(lèi)適配器其實(shí)算是同一種思想,只不過(guò)實(shí)現(xiàn)方式不同。
根據(jù)合成復(fù)用原則,使用組合替代繼承,所以它解決了類(lèi)適配器必須繼承src的局限性問(wèn)題,也不再要求dst必須是接口。
2)????? 使用成本更低,更靈活。
9.6接口適配器
9.6.1接口適配器模式的介紹
一些書(shū)籍稱(chēng)為:適配器模式(Default Adapter Pattern)或缺省適配器模式。
核心思想:當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),可先設(shè)計(jì)一個(gè)抽象類(lèi)實(shí)現(xiàn)接口,并為該接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn)(空方法),那么該抽象類(lèi)的子類(lèi)可有選擇地覆蓋父類(lèi)的某些方法來(lái)實(shí)現(xiàn)需求
適用于一個(gè)接口不想使用其所有的方法的情況。
?
9.6.2接口適配器模式應(yīng)用實(shí)例
1)????? Android中的屬性動(dòng)畫(huà)ValueAnimator類(lèi)可以通過(guò)addListener(AnimatorListener listener)方法添加監(jiān)聽(tīng)器,那么常規(guī)寫(xiě)法如右:
2)????? 有時(shí)候我們不想實(shí)現(xiàn)Animator.AnimatorListener接口的全部方法,我們只想監(jiān)聽(tīng)onAnimationStart,我們會(huì)如下寫(xiě)


3)????? AnimatorListenerAdapter類(lèi),就是一個(gè)接口適配器,代碼如右圖:它空實(shí)現(xiàn)了Animator.AnimatorListener 類(lèi)(src)的所有方法
4)????? AnimatorListener是一個(gè)接口


5)????? 程序里的匿名內(nèi)部類(lèi)就是Listener具體實(shí)現(xiàn)類(lèi)

6)????? 案例說(shuō)明
類(lèi)圖

代碼演示
9.7適配器模式在SpringMVC框架應(yīng)用的源碼剖析
1)????? SpringMvc中的HandlerAdapter,就使用了適配器模式
2)????? SpringMVC處理請(qǐng)求的流程回顧
3)????? 使用HandlerA dapter的原因分析:
可以看到處理器的類(lèi)型不同,有多重實(shí)現(xiàn)方式,那么調(diào)用方式就不是確定的,如果需要直接調(diào)用Controller方法,需要調(diào)用的時(shí)候就得不斷是使用if else來(lái)進(jìn)行判斷是哪一種子類(lèi)然后執(zhí)行。那么如果后面要擴(kuò)展Controller,就得修改原來(lái)的代碼,這樣違背了OCP原則。
4)????? 代碼分析+Debug源碼

5)????? 動(dòng)手寫(xiě)SpringMVC通過(guò)適配器設(shè)計(jì)模式獲取到對(duì)應(yīng)的Controller的源碼


源碼分析等學(xué)習(xí)了SpringMVC再補(bǔ)上!
9.8適配器模式的注意事項(xiàng)和細(xì)節(jié)
1)????? 三種命名方式,是根據(jù)src是以怎樣的形式給到Adapter(在Adapter里的形式)來(lái)命名的。
2)????? 類(lèi)適配器:以類(lèi)給到,在Adapter里,就是將src當(dāng)做類(lèi),繼承
對(duì)象適配器:以對(duì)象給到,在Adapter里,將src作為一個(gè)對(duì)象,持有
接口適配器:以接口給到,在Adapter里,將src作為一個(gè)接口,實(shí)現(xiàn)
3)????? Adapter模式最大的作用還是將原本不兼容的接口融合在一起工作。
4)????? 實(shí)際開(kāi)發(fā)中,實(shí)現(xiàn)起來(lái)不拘泥于我們講解的三種經(jīng)典形式