軟體設計模式系列之十二——外觀模式

来源:https://www.cnblogs.com/coodream2009/archive/2023/09/22/17722488.html
-Advertisement-
Play Games

不同行業基本都會有自己獨特的業務,甚至同行的不同企業之間的業務邏輯也會相差千里,只有最大程度抽象出通用性、標準性和普適性的系統才能夠成為平臺系統,平臺系統開發的成本和難度可想而知。 個人深度參與或獨立設計開發過的公共服務型平臺系統,主要包括基礎數據平臺、支付平臺、財務平臺、結算平臺、配送平臺、CRM ...


在軟體設計中,經常會遇到需要與複雜子系統進行交互的情況。為了簡化客戶端與子系統之間的交互,提高系統的可維護性和可用性,外觀模式應運而生。外觀模式(Facade Pattern)是一種結構型設計模式,它提供一個統一的界面,用於訪問系統中的一組相關介面,從而隱藏了系統的複雜性。在本文中,我們將深入探討外觀模式,包括其定義、舉例說明、結構、實現步驟、代碼實現(使用Java語言)、典型應用場景、優缺點、類似模式以及最後的小結。

1 模式的定義

外觀模式是一種結構型設計模式,它提供了一個簡化的介面,用於訪問系統中的一組相關介面,以隱藏系統的複雜性。外觀模式的主要目標是簡化客戶端與子系統之間的交互,同時降低了系統的耦合度。它允許客戶端通過一個統一的入口點來與系統進行通信,而不需要瞭解系統內部的具體細節和複雜性。

2 舉例說明

讓我們通過幾個簡單的例子來說明外觀模式的概念。
音響系統的例子。假設我們正在開發一個音響系統,該系統包括音響控制、CD播放器、收音機和音箱等組件。客戶端希望能夠簡單地控制音響的各種功能,而不需要直接與每個組件進行交互。

智能手機的例子。智能手機的操作系統(如iOS和Android)為用戶提供了一個外觀,通過該外觀可以輕鬆訪問手機的各種功能,包括撥打電話、發送簡訊、瀏覽互聯網、使用應用程式等。用戶不需要瞭解手機的硬體和操作系統內部的複雜性。

家用電器的例子。一些現代家用電器,如洗衣機、洗碗機和微波爐,配備了控制面板,通過該面板用戶可以選擇不同的功能和設置。這些控制面板提供了一個簡化的外觀,使用戶能夠輕鬆操作家用電器。

汽車的駕駛控制台的例子。現代汽車的駕駛控制台包括了一系列按鈕、開關和顯示屏,通過這些控制界面,駕駛員可以控制汽車的各種功能,如調整座位、開啟空調、切換收音機頻道、導航、調整車速等。這些控制界面提供了一個簡化的外觀,使駕駛員能夠方便地控制汽車。

3 結構

外觀模式的結構包括以下主要組件:

外觀(Facade):外觀是外觀模式的核心組件,它提供了一個簡化的介面,用於與系統中的一組相關介面進行交互。外觀負責委派請求給相應的子系統對象。

子系統(Subsystems):子系統是系統中的各個組件或模塊,它們實現了系統的具體功能。外觀通過與子系統協作來完成客戶端的請求。

客戶端(Client):客戶端是使用外觀模式的類或模塊,它通過外觀來簡化與系統的交互。客戶端不需要直接與子系統的具體類進行通信。

4 實現步驟

要實現外觀模式,可以按照以下步驟進行操作:

定義子系統:首先,定義系統中的各個子系統,每個子系統負責實現一部分功能。

創建外觀類:創建一個外觀類,它包含對子系統的引用,並提供一個簡化的介面,用於客戶端訪問系統的功能。

在外觀類中委派請求:在外觀類中實現方法,將客戶端的請求委派給適當的子系統對象,以完成具體的操作。

客戶端使用外觀類:客戶端通過外觀類來訪問系統的功能,而不需要直接與子系統的具體類進行交互。

5 代碼實現

讓我們使用Java代碼來實現上面的音響系統的外觀模式:

首先,我們創建外觀類 StereoFacade:

public class StereoFacade {
    private StereoControl stereoControl;
    private CDPlayer cdPlayer;
    private Radio radio;
    private Speakers speakers;

    public StereoFacade() {
        stereoControl = new StereoControl();
        cdPlayer = new CDPlayer();
        radio = new Radio();
        speakers = new Speakers();
    }

    public void playMusic() {
        stereoControl.turnOn();
        cdPlayer.play();
        radio.tune();
        speakers.volumeUp();
    }

    public void turnOff() {
        stereoControl.turnOff();
        cdPlayer.stop();
        radio.turnOff();
        speakers.volumeDown();
    }
}

接下來,我們可以在客戶端使用外觀類:

public class ClientWithFacade {
    public static void main(String[] args) {
        StereoFacade stereoFacade = new StereoFacade();

        // 使用外觀模式簡化操作
        stereoFacade.playMusic();

        // 關閉音響
        stereoFacade.turnOff();
    }
}

通過外觀模式,客戶端只需與 `外觀類 StereoFacade 交互,而不需要瞭解音響系統的具體子系統。這大大簡化了客戶端的代碼,並提高了系統的可維護性和可用性。

6 典型應用場景

外觀模式通常在以下情況下得到廣泛應用:

簡化複雜系統。當系統包含多個複雜的子系統或模塊,並且客戶端需要與這些子系統進行交互時,外觀模式可以提供一個簡化的介面,以減少客戶端的複雜性。

解耦客戶端與子系統。外觀模式允許客戶端與系統的具體實現解耦,使得系統的更改不會影響到客戶端。

提供高層介面。外觀模式可以為系統提供一個高層介面,隱藏底層組件的複雜性,使客戶端更容易使用。

構建庫或框架。在設計庫或框架時,外觀模式可以提供一個簡單的介面,以便其他開發者能夠輕鬆使用庫中的功能。

7 優缺點

外觀模式具有一些優點和缺點,讓我們來看看:

優點:

簡化介面:外觀模式提供了一個簡化的介面,使客戶端更容易使用系統的功能。

降低耦合度:外觀模式將客戶端與子系統的具體實現解耦,允許系統的更改不會影響到客戶端。

提高可維護性:由於外觀模式隱藏了系統的複雜性,因此提高了系統的可維護性,減少了維護成本。

提供了更高層次的介面:外觀模式允許為系統提供高層次的介面,有助於組織和管理複雜的代碼。

缺點:

不符合開閉原則:如果系統的功能需要變化或擴展,可能需要修改外觀類,這可能會違反開閉原則。

可能引入單點故障:外觀模式將多個子系統封裝在一個外觀類中,如果外觀類發生故障,整個系統可能會受到影響。

8 類似模式

與外觀模式類似的模式包括以下幾種,它們都涉及到簡化複雜系統的介面或交互,但在目的和實現上略有不同。

適配器模式(Adapter Pattern)

適配器模式和外觀模式都是結構型設計模式,它們都涉及到簡化介面或交互,以便客戶端能夠更容易地使用系統的功能。適配器模式通常用於解決介面不相容的問題,將一個介面轉換為另一個介面。外觀模式用於提供一個統一的界面,隱藏系統的複雜性,使客戶端更容易使用。

代理模式(Proxy Pattern)

代理模式和外觀模式都涉及到一個對象(代理或外觀)充當客戶端與系統之間的中介,以控制訪問系統的功能。代理模式主要用於控制訪問對象,通常包括延遲載入、訪問控制或監控。外觀模式主要用於簡化客戶端與系統的交互,隱藏系統的複雜性。

裝飾模式(Decorator Pattern)

裝飾模式和外觀模式都是結構型設計模式,它們都涉及到對象的包裝和功能擴展。裝飾模式允許在運行時動態地添加功能,而不改變對象的介面。外觀模式提供一個統一的介面,用於訪問系統的一組相關介面,目的是隱藏系統的複雜性。

這些模式都與簡化系統的介面或交互有關,但它們的重點和用途略有不同。在實際應用中,應根據具體問題和需求選擇最合適的設計模式。

9 小結

外觀模式是一種有助於簡化複雜系統的結構型設計模式。它提供了一個統一的界面,用於訪問系統中的一組相關介面,從而隱藏了系統的複雜性。通過外觀模式,客戶端可以更輕鬆地與系統進行交互,而不需要瞭解系統內部的具體細節。這種模式提高了系統的可維護性、可用性,並降低了客戶端的複雜性。在設計和開發複雜系統時,外觀模式可以成為一個有用的工具,以提高代碼的可維護性和可擴展性。


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

-Advertisement-
Play Games
更多相關文章
  • MySQL 主從複製與讀寫分離 1、什麼是讀寫分離? 讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。資料庫複製被用來把事務性操作導致的變更同步到集群中的從資料庫。 2、為什麼要讀寫分離呢? 因為資料庫的“寫” ...
  • 最近,某白酒品牌頻頻吸引大眾眼球,白酒與咖啡、巧克力等聯名衍生品一經推出便掀起熱潮。某商品由於太過火爆,甚至一度售罄下架。 不得不說,我國擁有超大規模內需市場,消費潛力巨大。 當前,創新消費場景加上數字化融合轉型,成為酒企品牌開疆擴土、逆勢增長的重要途徑。 如今越來越多的酒企開始擁抱數字化,建立涵蓋 ...
  • 1. 每個人都知道需要備份,但並不是每個人都能意識到需要的是可恢復的備份 1.1. 如果你沒有提前做好備份規劃,也許以後會發現已經錯失了一些最佳的選擇 1.2. 在伺服器已經配置好以後,才想起應該使用LVM,以便獲取文件系統的快照——但這時已經太遲了 1.3. 如果你沒有計劃做定期的恢復演練,當真的 ...
  • 在日常開發中,很多時候需要對數組進行分組,每次都要手寫一個分組函數,或者使用lodash的groupBy函數。好消息是,JavaScript 現在正在引入全新的分組方法:Object.groupBy和Map.groupBy,以後再也不需要手寫分組函數了,目前最新版本的 Chrome(117)已經支持 ...
  • 前言 Vue 3是一個功能強大的前端框架,它引入了一些令人興奮的新特性,其中最引人註目的是ref和reactive。這兩個API是Vue 3中響應式編程的核心,本文將深入探討它們的用法和差異。 什麼是響應式編程? 在Vue中,響應式編程是一種使數據與UI保持同步的方式。當數據變化時,UI會自動更新, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 使用Canvas繪製一個驗證碼組件 前言 驗證碼,這一日常伴隨我們的要素,是我們線上交互的重要安全保障。你的手機簡訊里是否被它占據半壁江山,今天我們就來聊聊如何在網頁上實現一個簡單的驗證碼組件。大家在登錄網站時為了防止被惡意攻擊或者多次點 ...
  • 搭建後臺管理系統模板 2.1項目初始化 今天來帶大家從0開始搭建一個vue3版本的後臺管理系統。一個項目要有統一的規範,需要使用eslint+stylelint+prettier來對我們的代碼質量做檢測和修複,需要使用husky來做commit攔截,需要使用commitlint來統一提交規範,需要使 ...
  • 一、為什麼要做穩定性建設 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...