Android設計模式--適配器模式

至誠之道,可以前知

一,定義

適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

適配器模式在我們的開發中使用率極高,ListView,GridView,RecyclerView等都使用了適配器模式,它其實就是將兩個不兼容 的類融合在一起,它有點像粘合劑,將不同的東西通過一種轉換使得他們能夠協作起來。

二,使用場景

1,系統需要使用現有的類,而此類的接口不符合系統的需要,即接口不兼容

2,想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作

3,需要一個統一的輸出接口,而輸入端的類型不可預知

三,角色介紹

1,Target: 目標角色,也就是所期待得到的接口。注意:在類適配器模式中,目標不可以是類

2,Adaptee:現在需要適配的接口

3,Adapter:適配器角色,也是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不可以是接口,而必須是具體類

四,類適配器模式的使用

玩過和平精英吃雞手游的玩家都知道,大家都是在手機或者平板電腦上面用手搓者玩的,這更適合那些沒玩過射擊游戲的新手玩家,但是對于大多數端游老玩家來說,手搓很不習慣,于是王座就誕生了,它可以讓玩家通過鍵鼠模擬手搓在手機或者平板上操作游戲,這里我們就可以把王座看作是適配器角色,目標角色就是鍵鼠操作游戲,Adaptee角色就是手搓操作游戲。

創建一個目標角色接口使用鍵鼠玩游戲:

public interface KeyMouse {void playGameByKM();
}

創建一個適配器角色,王座,可以通過王座玩游戲:

public class Adapter extends Hand implements KeyMouse{@Overridepublic void playGameByKM() {System.out.println("使用鍵鼠輸入操作信號");System.out.println("使用王座將鍵鼠操作信號轉換成模擬手指操作信號");playGameByHand();}
}

創建一個被適配的角色,手搓玩游戲:

public class Hand {public void playGameByHand(){System.out.println("通過手搓玩游戲");}
}

使用:

Adapter adapter =new Adapter();
adapter.playGameByKM();

輸出:

這樣就可以通過王座玩吃雞了。

五,對象適配器模式的使用

與類適配器模式一樣,對象的適配器模式把被適配的類的API轉換成為目標類的API,與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adapter類,而是使用代理關系連接到Adapter類。

還是上面那個吃雞的例子。

首先還是創建我們的目標接口來使用鍵鼠玩游戲:

public interface KeyMouse {void playGameByKM();
}

然后創建一個被適配的角色,手搓玩游戲:

public class Hand {public void playGameByHand(){System.out.println("通過手搓玩游戲");}
}

最后創建我們的適配器adapter,王座:

public class KingAdapter implements KeyMouse{private Hand hand;public KingAdapter(Hand hand) {this.hand = hand;}@Overridepublic void playGameByKM() {System.out.println("使用鍵鼠輸入操作信號");System.out.println("使用王座將鍵鼠操作信號轉換成模擬手指操作信號");hand.playGameByHand();}
}

最后在使用時:

KingAdapter adapter =new KingAdapter(new Hand());
adapter.playGameByKM();

輸出:

該方式直接將要被適配的對象傳遞到Adapter中,使用組合的形式實現接口兼容的效果,比類適配器更為靈活,它的另一個好處是被適配對象中的方法不會暴露出來,而類適配器由于繼承了被適配對象,因此,被適配對象類的函數在Adapter類中也都含有,這使得Adapter類出現一些奇怪的接口,用戶使用成本較高,因此,對象適配器模式更加靈活實用。

六,總結

在實際開發中,特別是在自定義view等情況下,適配器模式的應用非常廣泛且具有重大意義。

優點:

1,更好的復用性:系統需要使用現有的類,而次類的接口不符合系統的需要,那么通過適配器模式就可以讓這些功能得到更好的復用。

2,更好的擴展性:在實現適配器功能的時候,可以調用自己開發的功能,從而自然的擴展系統的功能。

缺點:過多的使用適配器,會讓系統非常凌亂,不易整體把握。例如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此,如果不是很有必要,可以不適用適配器,而是直接對系統進行重構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試cast:reinterpret_cast/const_cast/static_cast/dynamic_cast

目錄 1. cast 2. reinterpret_cast 3. const_cast 3.1 加上const的情況 3.2 去掉const的情況 4. static_cast 4.1 基本類型之間的轉換 4.2 void指針轉換為任意基本類型的指針 4.3 子類和父類之間的轉換 5. dynamic_cast 5.1 RTTI(Run-time Type Identification) 1.…

Selenium實現多頁面切換

當使用 Selenium 進行自動化測試或爬取數據時,有時需要處理多個頁面之間的切換。以下是一些可能需要多頁面切換的情況: 1、打開新窗口/頁面: 在當前頁面上點擊鏈接、按鈕或執行某些操作時,可能會打開一個新的窗口或頁面。此時&a…

【element優化經驗】怎么讓element-ui中表單多語言切換排版不亂

目錄 前言: 痛點: 1.左對齊,右對齊在中文和外語情況下字數不同,固定寬度會使名稱換行,不在整行對齊,影響美觀。 2.如果名稱和輸入框不在一行,會使頁面越來越長 3.label-width值給變量&#…

隨筆記錄-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

環境:springboot-2.7.5 配置文件配置靜態資源映射 springboot配置靜態資源映射方式是通過 WebMvcAutoConfiguration 實現的 spring: # resources: # # 自springboot 2.5.5之后,該屬性已經被廢棄,使用spring.web.resources.static-locat…

爬蟲逆向你應該懂得Javascript知識

背景 大家在學習爬蟲逆向的時候,一般都會涉及到對js源文件進行代碼扣去,但是有的時候,你最好有js基礎,能發現加密或者解密在那個位置,或者是能用python改寫js代碼,這就對個人的Javascript的能力有一定要求…

Switch的使用及其注意事項

注意第五點要看清,case執行完后匹配沒有成功,如過有Default,將會執行Default,如果有case在Default之后,而且Default沒有break語句,那么將會繼續執行case的語句,此時case中的常量表達式只起語句標…

【Skynet 入門實戰練習】游戲模塊劃分 | 基礎功能模塊 | timer 定時器模塊 | logger 日志服務模塊

文章目錄 游戲模塊基礎功能模塊定時器模塊日志模塊通用模塊 游戲模塊 游戲從邏輯方面可以分為下面幾個模塊: 注冊和登錄網絡協議數據庫玩法邏輯其他通用模塊 除了邏輯劃分,還有幾個重要的工具類模塊: Excel 配置導表工具GM 指令測試機器人…

系列一、Spring整合MyBatis不忽略mapper接口同目錄的xxxMapper.xml

一、概述 默認情況下maven要求我們將xml配置、properties配置等都放在resources目錄下,如果我們強行將其放在java目錄,即將xxxMapper.xml和xxxMapper接口放在同一個目錄下,那么默認情況下maven打包時會將這個xxxMapper.xml文件忽略掉&#xf…

【辦公常識_1】寫好的代碼如何上傳?使用svn commit

首先找到對應的目錄 找到文件之后點擊SVN Commit

【標注數據】labelme的安裝與使用

這里寫目錄標題 下載標數據 下載 標數據 打開自動保存 創建矩形

NSGA-II求解微電網多目標優化調度(MATLAB)

一、NSGA-II簡介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基礎上提出的,它比 NSGA算法更加優越:它采用了快速非支配排序算法,計算復雜度比 NSGA 大大的降低;采用了擁擠度和擁擠度比較算子,代替了需要指定的…

Design Guidelines for 100 Gbps

文章目錄 Stratix V GT Transceiver ChannelsCFP2 Host Connector Assembly and PinoutStratix V GT to CFP2 Interface Layout DesignBoard Stack Up DimensionsExample Design Channel PerformanceSimulation Results for Stratix V GT to CFP2 Connector Layout Design Desi…

特征工程完整指南 - 第二部分

蘇米特班迪帕迪亞 照片由Dan Cristian P?dure?在Unsplash上拍攝 一、說明 DATA,通常被稱為原油,需要經過加工和清潔才能有效地用于各種用途。正如我們不直接使用來自其來源的石油一樣,數據也經過類似的處理以提取其真正價值。 二、特征選…

LabVIEW中如何達到NI SMU最大采樣率

LabVIEW中如何達到NI SMU最大采樣率 NISMU的數字化儀功能對于捕獲SMU詳細的瞬態響應特性或表征待測設備(DUT)響應(例如線性調整率和負載調整率)至關重要。沒有此功能,將需要一個外部示波器。 例如,假設在…

Docker start/stop/restart 命令

docker start:啟動一個或多個已經被停止的容器。 docker stop:停止一個運行中的容器。 docker restart:重啟容器。 語法 docker start [OPTIONS] CONTAINER [CONTAINER...]docker stop [OPTIONS] CONTAINER [CONTAINER...]docker restart…

設計循環隊列(詳解)

呀哈嘍,我是結衣 今天給大家帶來的內容如標題所述,我們來設計環形隊列,雖然隊列沒有講,但是我就是想講啊。那么環形隊列現在開始。 隊列的屬性 在設計環形隊列前,我們先要了解隊列的特點(先進先出&#x…

鴻蒙(HarmonyOS)應用開發——ArkTs學習準備

介紹 前面我們已經介紹了,如何安裝HarmonyOS的IDE ,那么現在我們來介紹一下。HarmonyOS 開發的語言——ArkTs. ArkTS 是HarmonyOS的開發語言,他是typescript 的擴展,而typesrcipt是javascript的超集,如果你不太熟悉typescript語法…

qml Loader使用介紹

QML Loader 是 Qt Quick 框架中的一個元素,它允許你動態地加載和卸載 QML 組件。Loader 的作用主要體現在以下幾個方面: 延遲加載:Loader 允許你在需要時才加載組件,而不是在應用程序啟動時一次性加載所有組件。這樣可以加快應用程序的啟動時間,因為它只需要初始化用戶當前…

MIT_線性代數筆記:列空間和零空間

目錄 前言子空間綜述列空間 Column space零空間(或化零空間)Nullspaceb 值的影響 Other values of b 前言 本節繼續研究子空間,特別是矩陣的列空間(column space)和零空間(nullspace)。 子空間…