【設計模式】Adapter

来源:https://www.cnblogs.com/zhouzekai/archive/2019/07/24/11240406.html
-Advertisement-
Play Games

前言 Adapter設計模式,允許客戶端使用介面不相容的類。 昨天收拾一些以前的東西,發現了藏在柜子里的一條線,這條線叫做OTG。這條線的一端是micro usb的輸出口,另一端是usb的輸入口。這條線,就是Adapter。手機如果想要使用U盤,會發現這個U盤的usb輸出口太大了,根本插不進手機的接 ...


前言

Adapter設計模式,允許客戶端使用介面不相容的類。

昨天收拾一些以前的東西,發現了藏在柜子里的一條線,這條線叫做OTG。這條線的一端是micro-usb的輸出口,另一端是usb的輸入口。這條線,就是Adapter。手機如果想要使用U盤,會發現這個U盤的usb輸出口太大了,根本插不進手機的介面。怎麼辦呢?使用適配器就好!

只要手機插上OTG,U盤再接上OTG,這樣手機就可以歡快地使用U盤啦。

這是硬體的適配器,手機作為客戶端,原本不能使用介面不相容的U盤。手機只認它能認的介面,micro-usb也好,type-c也好,只要是同一個介面,它都認。OTG作為適配器,它要有一端,能讓手機認識,還要有另一端能接受它想認得的東西(U盤)。

在軟體開發中,OTG能給我們帶來什麼啟示呢?

1, 手機認得OTG的一端。

明確客戶端需要的類,讓Adapter去繼承/實現客戶端需要的類,這樣客戶端就能認Adapter了。

2, OTG能認到U盤。

Adapter能獲取到被適配對象的信息,方法有二:在Adapter中放置一個對象;讓Adapter繼承被適配類。

3, 手機通過OTG讀取U盤的信息。

Adapter需要為客戶端實現特定的調用,讓其可以操作被適配對象。

Java中的Arrays

Java中Arrays.asList()返回一個適配器。

客戶端能使用的是List類型,而不是一個數組,這時候,就可以使用Arrays.asList,將它轉成客戶端需要的。

Arrays實現了一個內部類ArrayList,這個有別於java.util.ArrayList,Arrays.ArrayList不能對List進行add,remove等操作。這麼做可以保證數據的一致性,在數組中做出的修改,在Adapter中對應做出修改。同時還節省空間/時間,不需要新建一個數組,因為Arrays.ArrayList內部存儲了一個指向這個數組的成員,既不需要開闢新的空間,又不需要複製操作。

用Adapter設計模式來看,List為客戶端需要的類,Arrays.ArrayList為適配器,數組為被適配對象。

以下代碼去掉了Arrays.ArrayList的部分實現:

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }

    @Override
    public E get(int index) {
        return a[index];
    }

    @Override
    public E set(int index, E element) {
        E oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

    ...
}

Android中的Adapter

安卓中使用的Adapter符合Adapter設計模式嗎?比如Adapter,ListAdapter,ArrayAdapter。

不是。正如[1]中所指出的

There are plenty of classes in the world named similarly to GoF that have nothing to do with those patterns

雖然名字是XXXAdapter,實際上它扮演的更像是MVP中的Presenter。其中還使用了觀察者的設計模式。想要自定義ListView的item樣式,可以使用這個Adapter,它會幫你處理數據,幫你處理View。這裡Adapter的作用是:讓模型adapt視圖。

參考鏈接

  1. https://stackoverflow.com/questions/41626980/are-android-adapters-an-example-of-adapter-design-pattern

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫代碼的時候就經常把這兩個屬性弄混淆,到底是href還是src,href表示超文本引用,用在link和a等元素上,href是引用和頁面關聯,是在當前元素和引用資源之間建立聯繫,src表示引用資源,表示替換當前元素,用在img,script,iframe上,src是頁面內容不可缺少的一部分。 src是 ...
  • 最近在做項目的時候發現的一個問題,通過ajax動態載入出來的一個button值綁定不了點擊事件。我使用的是datatables這款表單插件,表單內容是通過ajax動態渲染出來的。 解決方案: 通過Google,我發現在jquery1.7版本之前通常使用 .live() 這個事件,但是這個方法在1.9 ...
  • 首先我們還是先看一下WEB前端目前的工資情況吧,我在IT招聘網站拉勾網來進行搜索1-3年WEB前端工作經驗大專學歷的條件來看。 深圳: 可以看出目前深圳的平均的工資都在10K以上,因為大城市給的機會多,好公司也多,福利也好,所以在一線城市做WEB前端開發的,是非常稀缺的。 如果我們把標準降低在二線城 ...
  • vue更新換代很快,馬上vue都要出3.0了,這是一個巨大的變革,不過今天講的是vuecli3.0,裡面使用的vue仍然是2的,所有可以放心大膽使用。 Vue CLI 是一個基於 Vue.js 進行快速開發的完整系統,裡面所有具體介紹都可以去官網查看到 "vuecli官網移步" 這裡主要是講一些我實 ...
  • 譯者按: 使用 來捕獲所有的異常 原文: "Async Await Error Handling in JavaScript" 譯者: "Fundebug" 本文采用意譯,版權歸原作者所有 async/await 中的異常處理很讓人混亂。儘管有很多種方式來應對 "async 函數的異常" ,但是連經 ...
  • web前端全套視頻教程,html5,css3,javascript,.AngularJS. 下載地址 ...
  • 1.更換窗體圖標 方法:單擊窗體,更改icon屬性。 2.調整窗體打開時預設位置 方法:單擊窗體,更改StartPotion屬性。 3.修改窗體大小 方法:單擊窗體,更改Size屬性。 4.設置窗體的背景圖片 方法:單擊窗體,更改BackgroundImage屬性。 5.打開新窗體 首先新建一個窗體 ...
  • 1.馮·諾依曼體系 現代電腦的模型都是基於馮·諾依曼體系的,馮·諾依曼體系的基本組成有存儲器,計數器,控制器,輸入和輸出設備,總共有這五大本分組成。下圖是我基於這五大組成部分畫了一個組成圖來表示他們之間的關係,如圖1-1。 圖1-1 基於馮·諾依曼體系,首先控制器從記憶體中取出指令,有控制器來執行, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...