<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不得不承認,這個設(shè)計模式人人都會

          共 2077字,需瀏覽 5分鐘

           ·

          2022-01-19 15:48

          點擊藍色“程序員黃小斜”關(guān)注我喲

          加個“星標”,每天和你一起多進步一點點


          今天要講的設(shè)計模式堪稱人人都會,不是因為它太簡單,而是因為它太常見,它就是 適配器模式

          這個玩意大家應(yīng)該都認識,它是一個耳機轉(zhuǎn)接頭

          假如你只有一個圓孔插頭的耳機,但是手機的音頻插口是type-c的,這時候你是沒辦法用耳機聽歌的

          利用耳機轉(zhuǎn)接頭,就可以使用圓孔的插頭和type-c插口的手機來聽歌

          在我們對接一個三方系統(tǒng)時,假如我們系統(tǒng)的接口規(guī)范和三方系統(tǒng)的接口規(guī)范不一樣,該怎么對接

          接口規(guī)范不一致,導(dǎo)致我們不能和三方系統(tǒng)完成對接,必須修改其中一方的接口規(guī)范

          但是,不管修改哪一方的接口規(guī)范都可能導(dǎo)致系統(tǒng)已有的功能不能正常使用

          讓我們發(fā)揮想象,把我們系統(tǒng)比作是圓孔耳機,把三方系統(tǒng)比作是type-c插口的手機。我們只需要一個「耳機轉(zhuǎn)接頭」就可以完成兩個系統(tǒng)的對接,而且不需要修改任何一方的代碼

          這里的「耳機轉(zhuǎn)接頭」的作用就是把我們系統(tǒng)的接口規(guī)范轉(zhuǎn)換成三方系統(tǒng)的接口規(guī)范,讓兩個系統(tǒng)都不需要修改代碼就可以完成無縫對接

          仔細想想一下,在我們的實際工作中,是不是經(jīng)常做「耳機轉(zhuǎn)接頭」這樣的工作

          實際上,「耳機轉(zhuǎn)接頭」就是一個適配器,這就是一個簡單的「適配器模式」

          系統(tǒng)間的調(diào)用會用到適配器模式,代碼直接的調(diào)用也會用到適配器模式

          使用場景

          在兩個功能間無法完成無縫對接,必須要修改其中一處功能,但是修改工作量較大或者擔(dān)心修改完造成已有功能無法使用時,可以考慮使用適配器模式

          適配器模式的識別方法:「當(dāng)一個方法的入?yún)⑹且粋€對象,而返回值是另一個對象時,這個方法就是一個適配器模式」

          比如,java中的 java.util.Arrays#asList()

          這個方法的作用是把一個數(shù)組轉(zhuǎn)換成list集合。數(shù)組和list屬于兩個不同的類,沒辦法完成無縫轉(zhuǎn)換

          這時候就需要這個方法來進行「適配」,它的入?yún)⑹且粋€任意類型的數(shù)組對象,返回值是一個list對象,符合上面我們說的適配器模式的識別方法,所以這個方法就是一個適配器模式

          實際案例

          假如我們有一個接口,需要統(tǒng)計用戶最近購買的商品信息并返回給前臺

          查詢數(shù)據(jù)庫的方法已經(jīng)封裝好,返回的數(shù)據(jù)格式如下

          前臺要求返回的數(shù)據(jù)格式如下

          我們先來用代碼模擬一下從數(shù)據(jù)庫查詢數(shù)據(jù)的邏輯

          這里需要一個實體類,用來對應(yīng)數(shù)據(jù)庫查詢出來的數(shù)據(jù)

          用代碼模擬從數(shù)據(jù)庫查詢出5條數(shù)據(jù)

          再來模擬一下前臺要求的數(shù)據(jù)格式

          這里需要兩個實體類對應(yīng)前臺要求的數(shù)據(jù)格式

          用代碼來模擬一下實際給前臺返回數(shù)據(jù)的邏輯

          從數(shù)據(jù)庫查詢出來的數(shù)據(jù)和前臺要求的數(shù)據(jù)都用代碼模擬出來了,那么該怎么把從數(shù)據(jù)庫查詢出來的格式轉(zhuǎn)換成前臺需要的格式?

          也就是說要怎么把List對象轉(zhuǎn)換成List對象?

          修改查詢數(shù)據(jù)庫的方法邏輯顯然不合適,作為DAO層對所有業(yè)務(wù)提供通用的查詢數(shù)據(jù)庫的能力,修改后會導(dǎo)致其他調(diào)用該方法的業(yè)務(wù)報錯

          修改前臺數(shù)據(jù)格式也不合適,前臺開發(fā)模式是一云多端的模式,不可能讓所有端的前臺都跟著修改代碼

          所以,該適配器模式出場啦

          我們需要定義一個方法,方法的入?yún)⑹?/span>List,方法的返回值是List,在這個方法中完成兩個對象的轉(zhuǎn)換

          ps:該方法的業(yè)務(wù)邏輯稍微有點復(fù)雜,感興趣的同學(xué)可以看一下。不愿意看也行,只看方法的入?yún)⒑头祷刂狄膊挥绊憣m配器模式的理解

          這樣我們就用適配器模式完成了兩個對象的轉(zhuǎn)換,而且兩方的業(yè)務(wù)邏輯都不需要修改,堪稱“完美”

          總結(jié)

          適配器模式又被稱為包裝模式或封裝器模式

          當(dāng)兩個功能間無法完成無縫對接,必須要修改其中一處功能,但是修改工作量較大或者擔(dān)心修改完造成已有功能無法使用時,可以考慮使用適配器模式

          「適配器模式的優(yōu)點」

          • 解耦:適配器將兩個功能完全解耦,從而達到不需要修改任何一方的原有邏輯的目的
          • 提高代碼復(fù)用性:適配的兩方不需要修改任何邏輯,可以更專注自己本身的業(yè)務(wù)邏輯,對外提供更通用的能力,使代碼的復(fù)用性更好
          • 提高系統(tǒng)的擴展性:可以通過各種適配器,對已有的功能或系統(tǒng)進行適配,讓其能適應(yīng)更多的場景,使自己的功能或系統(tǒng)擴展性更高

          「適配器模式的缺點」

          • 造成系統(tǒng)結(jié)構(gòu)混亂:過多的使用適配器,會造成系統(tǒng)過于龐大且混亂不利于系統(tǒng)維護

          學(xué)會設(shè)計模式不是目的,理解設(shè)計模式隱含的設(shè)計思想才能無往不利

          如何優(yōu)雅地進行接口管理?騰訊阿里大佬首次分享秘訣


          面試官:有了 for 循環(huán) 為什么還要 forEach ?


          Java 結(jié)構(gòu)化數(shù)據(jù)處理開源庫 SPL


          —?【 THE END 】—
          公眾號[程序員黃小斜]全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取!

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點“在看”,關(guān)注公眾號并回復(fù) PDF?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

          謝謝支持喲 (*^__^*)

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.666.日本高清 | 欧美日韩国产操逼 | 国产27区| 做爱小网站 | igao在线观看免费完整版 |