適配器和外觀模式.

来源:https://www.cnblogs.com/jmcui/archive/2018/12/17/10129626.html
-Advertisement-
Play Games

一、適配器模式 1、概念 定義:將一個類的介面,轉換成客戶期望的另一個類的介面,適配器讓原本介面不相容的類可以合作無間。 安卓轉Type C頭,就是一個典型的適配器模式。在安卓頭和 Type C 之間引入適配器,安卓頭是被適配者。 解析:   1、 客戶(Client)通過目標接 ...


一、適配器模式

1、概念

  • 定義:將一個類的介面,轉換成客戶期望的另一個類的介面,適配器讓原本介面不相容的類可以合作無間。
  • 安卓轉Type-C頭,就是一個典型的適配器模式。在安卓頭和 Type-C 之間引入適配器,安卓頭是被適配者。
  • 解析:
      1、 客戶(Client)通過目標介面(Target Interface)調用適配器(Adapter)的方法對適配器發出請求。
      2、 適配器使用被適配器介面(Adaptee Interface)把請求轉換成被適配者的一個或多個調用介面。
      3、 客戶接收到調用的結果,但並未察覺這一切是適配器在起轉換作用。
  • 結構:適配器有兩種,分別是類適配器和對象適配器。類適配器採用多重繼承實現,在 Java 中不適用;對象適配器採用繼承和組合實現。以下是兩種結構的類圖:

avatar

2、Demo 實現

 在 JDK1.0 時我們用的集合還是 Vector(後來推薦使用 ArrayList),我們用的迭代器還是 Enumeration(後來推薦使用 Iterator)。現在我們想寫一個適配器,讓 Vector 也能使用 Iterator 迭代器,即在 Enumeration 和 Iterator 之間做適配。

/**
 * 1、Iterator 是目標(Target)介面角色。
 * 2、Enumeration 是被適配者(Apaptee)角色。
 * 3、EnumerationAdapter 是適配者(Adapter)角色。
 */
public class EnumerationAdapter implements Iterator {

    private Enumeration enumeration;

    public EnumerationAdapter(Enumeration enumeration) {
        this.enumeration = enumeration;
    }

    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove");
    }
}
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add("java");
        vector.add("python");
        vector.add("javaScript");
        Enumeration enumeration = vector.elements();
        Iterator iterator = new EnumerationAdapter(enumeration);
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

3、總結

  • 應用場景:系統需要使用一些現有的類,而這些類的介面不符合系統的需要,甚至沒有這些類的源代碼。
  • 優點:
      1、將介面轉化成客戶真正能接受的介面,為不用的介面之間做適配。
      2、客戶和被適配者之間是解耦的。倘若一段時間之後,我們想要改變介面,適配器可以將改變的部分封裝起來,而客戶不用做任何的改變。另外,被適配者的任何子類,都可以搭配著適配器使用。
  • 缺點:
      1、一次最多只能適配一個適配者類,不能同時適配多個適配者。
      2、目標抽象類只能為介面,不能為類,其使用有一定的局限性。

二、外觀模式

  • 外觀(Facade)模式:提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。
  • 外觀模式說是設計模式中最簡單的模式也不為過,因為它沒有那麼多複雜的角色,它的工作只有一個 —— 簡化介面。它可能持有一個或者數個類對象的組合,然後將它們複雜的一切(實現、執行順序等)隱藏在身後,只露出一個乾凈美好的外觀。
  • 外觀模式不只是簡化了介面,也將客戶從組件的子系統中解耦。
  • 外觀模式提供簡化介面的同時,依然將系統完整的功能暴露出來,以供需要的人使用。

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

-Advertisement-
Play Games
更多相關文章
  • 今天在寫一個小的 CSS Demo,一個關於 3d 球的旋轉動畫,關於 CSS 3D,少不了會使用下麵這幾個屬性: 這個 Demo 你可以戳這裡,大概是這樣:CodePen Demo - 3D ball: 嗯,大概到了這個效果,想到了 CSS 混合模式 mix-blend-mode,尋思著,利用混合 ...
  • 使用create react app腳手架搭建環境 1、安裝node 。軟體下載地址:,我下的推薦的版本。 安裝之後測試是否安裝成功。windows系統下,輸入Win+R輸入cmd ,打開運行視窗,輸入 node v 顯示版本號則表示安裝成功。接下來可以看下是否安裝npm,輸入npm v ,顯示版本 ...
  • 首先給一個神奇的圖: 我的反應,精分吧!一會兒true一會兒false的。。。 後來發現,把g去掉後就正常了,那這是為什麼呢??lastIndex惹得鬼! 正文: lastIndex 全局正則表達是,有一個屬性:lastIndex,這個屬性是用來存放上一次匹配文本之後的第一個字元的位置。 exec( ...
  • 通過 jQuery,可以很容易地添加新元素/內容。 添加新的 HTML 內容 一共有四種方法: append() - 在被選元素的結尾插入內容 prepend() - 在被選元素的開頭插入內容 after() - 在被選元素之後插入內容 before() - 在被選元素之前插入內容 以下為jQuer ...
  • 閉包在紅寶書中的解釋就是:有權訪問另一個函數作用域中的變數的函數。 1.變數作用域 全局變數:所有的函數外部定義的變數,它的作用域是整個script。 局部變數:定義在函數體內部的變數,作用域僅限於函數體內部。離開函數體就會無效。再調用就是出錯。 舉例如下-局部變數: a變數定義在fun函數內,是局 ...
  • 什麼是瀏覽器內核 瀏覽器內核的分類 瀏覽器內核的作用 W3C 帶著問題去瞭解 1、什麼是瀏覽器內核? 瀏覽器端內核就是開發商按照約定好的規則開發出的能夠將正確開發者代碼渲染成頁面的東西 2、瀏覽器內核的分類: webkit內核:chrome瀏覽器及大部分安卓手機、safari Gecko內核:FF ...
  • java深克隆和淺克隆 基本概念 1. 被覆制對象的所有變數都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所拷貝的對象,而不複製它所引用的對象。 1. 被覆制對象的所有變數都含有與原來的對象相同的值,除去那些引用其他對象的變數。那些引用其他對象的變數將 ...
  • 轉載請標明出處: https://www.fangzhipeng.com 本文出自 "方誌朋的博客" 在上一篇文章詳細的介紹了Gateway的Predict,Predict決定了請求由哪一個路由處理,在路由處理之前,需要經過“pre”類型的過濾器處理,處理返迴響應之後,可以由“post”類型的過濾器 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...