23種設計模式-外觀(Facade)設計模式

外觀設計模式

  • 🚩什么是外觀設計模式?
  • 🚩外觀設計模式的特點
  • 🚩外觀設計模式的結構
  • 🚩外觀設計模式的優缺點
  • 🚩外觀設計模式的Java實現
  • 🚩代碼總結
  • 🚩總結

🚩什么是外觀設計模式?

外觀設計模式(Facade Pattern) 是一種 結構型設計模式,它提供了一個 統一的接口,用于訪問子系統中的一組接口。外觀模式通過定義一個 高層接口,簡化了客戶端與子系統之間的交互,隱藏了子系統的復雜性。

使用場景

  • 當需要為 復雜的子系統 提供一個 簡單的接口 時。

  • 當需要 解耦客戶端與子系統 時,使子系統更容易維護和擴展。

  • 當需要 分層構建系統 時,外觀模式可以作為每層的入口點。

🚩外觀設計模式的特點

  • 簡化接口:外觀模式提供了一個簡化的接口,隱藏了子系統的復雜性。

  • 解耦:客戶端與子系統之間通過外觀接口交互,降低了耦合度。

  • 易用性:客戶端無需了解子系統的內部細節,只需調用外觀接口即可。

  • 靈活性:子系統可以獨立變化,只要外觀接口保持不變,客戶端代碼無需修改。

🚩外觀設計模式的結構

外觀模式主要包含以下部分:

  • Facade(外觀):提供一個統一的接口,客戶端通過該接口與子系統交互。

  • SubSystem(子系統):由多個類或模塊組成,實現具體的功能。

  • Client(客戶端):通過 Facade 接口與子系統交互,無需直接調用子系統的類。

圖例:

在這里插入圖片描述

🚩外觀設計模式的優缺點

? 優點

  • 簡化接口:外觀模式提供了一個簡化的接口,隱藏了子系統的復雜性。

  • 解耦:客戶端與子系統之間通過外觀接口交互,降低了耦合度。

  • 易用性:客戶端無需了解子系統的內部細節,只需調用外觀接口即可。

  • 靈活性:子系統可以獨立變化,只要外觀接口保持不變,客戶端代碼無需修改。

? 缺點

  • 不符合開閉原則:如果子系統需要新增功能,可能需要修改外觀接口。

  • 過度依賴:客戶端可能過度依賴外觀接口,導致外觀接口變得臃腫。

🚩外觀設計模式的Java實現

代碼地址:GitHub

  • 創建 子系統類 SubSystemOne、SubSystemTwo 和 SubSystemThree,分別實現具體的功能。

    • 子系統1SubSystemOne
    /*** @author hanson.huang* @version V1.0* @ClassName SubSystemOne* @Description 子系統1* @date 2025/3/24 17:00**/
    public class SubSystemOne {public void methodOne() {System.out.println("執行子系統一的功能");}
    }
    
    • 子系統2SubSystemTwo
    /*** @author hanson.huang* @version V1.0* @ClassName SubSystemTwo* @Description 子系統2* @date 2025/3/24 17:03**/
    public class SubSystemTwo {public void methodTwo() {System.out.println("執行子系統二的功能");}
    }
    
    • 子系統3SubSystemThree
    /*** @author hanson.huang* @version V1.0* @ClassName SubSystemThree* @Description 子系統3* @date 2025/3/24 17:04**/
    public class SubSystemThree {public void methodThree() {System.out.println("執行子系統三的功能");}
    }
    
  • 創建 外觀類 Facade,提供一個統一的接口,封裝子系統的調用。

/*** @author hanson.huang* @version V1.0* @ClassName Facade* @Description 外觀類* @date 2025/3/24 17:04**/
public class Facade {SubSystemOne subSystemOne;SubSystemTwo subSystemTwo;SubSystemThree subSystemThree;public Facade() {subSystemOne = new SubSystemOne();subSystemTwo = new SubSystemTwo();subSystemThree = new SubSystemThree();}public void methodA() {subSystemOne.methodOne();}public void methodB() {subSystemTwo.methodTwo();}public void methodC() {subSystemThree.methodThree();}
}
  • 測試外觀模式
/*** @author hanson.huang* @version V1.0* @ClassName FacadePattern* @Description 測試外觀模式* @date 2025/3/24 17:08**/
public class FacadePattern {public static void main(String[] args) {Facade facade = new Facade();facade.methodA();facade.methodB();facade.methodC();}
}

📌 運行結果

在這里插入圖片描述

🚩代碼總結

  • 子系統類 SubSystemOne、SubSystemTwo 和 SubSystemThree 分別實現具體的功能。

  • 外觀類 Facade 提供一個統一的接口,封裝子系統的調用。

  • 客戶端 通過 外觀類 與子系統交互,無需直接調用子系統的類。

🚩總結

  • 外觀設計模式(Facade Pattern) 提供了一個 統一的接口,用于訪問子系統中的一組接口,簡化了客戶端與子系統之間的交互。

  • 適用于 為復雜子系統提供簡單接口解耦客戶端與子系統分層構建系統 的場景。

  • Java 實現 需要 定義子系統類外觀類,并通過外觀類封裝子系統的調用。

? 適用場景:

  • 需要為 復雜的子系統 提供一個 簡單的接口 時。

  • 需要 解耦客戶端與子系統 時。

  • 需要 分層構建系統 時。

  • Java中許多地方用到了外觀模式,在Java的GUI編程中,javax.swing 包大量運用了外觀模式。例如,創建一個簡單的窗口,你可以借助 JFrame 這個外觀類,而不用直接去操作底層復雜的窗口創建和管理機制。

創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??

在這里插入圖片描述

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

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

相關文章

capl語言基礎語法(二)

1.strncpy:將字符串復制到另一個字符串中。 輸入: dest 是目標字符串。 src 是源字符串。 n 是要復制的最大字符數。 語法: char *strncpy(char *dest, const char *src, size_t n); 例子: strncpy(gStringRep,"",…

QLoRA和LoRA 微調

QLoRA 其實是一種結合了量化和 LoRA 微調技術的統一方法,而不是同時使用兩種不同的微調方式。換句話說,QLoRA 的意思就是:先把大模型的主權重用低精度(例如 4-bit)量化,從而大幅減少存儲需求;然…

Qt Concurrent 并發 Map 和 Map-Reduce

并發 Map 和 Map-Reduce QtConcurrent::map()會對容器中的每個項目應用一個函數,對項目進行就地修改。QtConcurrent::mapped() 類似于 map(),但它返回的是一個包含修改內容的新容器。QtConcurrent::mappedReduced() 類似于 mapped(),只不過修…

RT-Thread-線程管理

一、線程管理 RT_Thread線程管理主要是實現線程管理和調度,線程分為用戶線程和系統線程。RT_Thread的線程調度器是搶占式的,尋找就緒狀態最高優先級線程。 線程管理的API函數 創建線程函數 rt_thread_t rt_thread_create( const char *name, //線程名稱 …

【CC2530 教程 十二】CC2530 Z-Stack 硬件抽象層

目錄 一、硬件抽象層簡介: (1)HAL 硬件抽象層是什么? (2)通俗易懂的解釋: (3)具體例子: 二、硬件抽象層HAL: (1)HAL…

Linux如何判斷磁盤是否已分區?

在 Linux 系統中,判斷磁盤是否已分區可通過以下方法實現: 方法 1:使用 fdisk -l 命令 此命令會列出所有磁盤及其分區的詳細信息: sudo fdisk -l輸出解讀: 若磁盤(如 /dev/sdb)下有類似 /dev/…

《熔化焊接與熱切割作業》考試注意事項

考試前的準備 攜帶必要的證件和材料:考生需攜帶身份證、準考證等有效證件,以及考試所需的焊接工具、材料等。確保證件齊全,避免因證件問題影響考試。 提前檢查焊接設備和工具:在考試前,考生應仔細檢查焊接設備和工具是…

Matlab Hessian矩陣計算(LoG算子)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 圖像的Hessian矩陣用于描述圖像灰度值的二階導數,可以用來分析圖像的局部曲率和變化。例如,在圖像邊緣檢測、特征點檢測等任務中,Hessian矩陣能幫助我們識別圖像的結構。 Hessian矩陣定義 對于二維圖像,Hessian…

selenium之處理彈框(alert、confirm、prompt)

彈框 WebDriver提供了一個API, 用于處理JavaScript提供的三種類型的原生彈窗消息. 這些彈窗由瀏覽器提供限定的樣式.;分別為以下三種 alerts警告框confirm確認框prompt提示框 話不多說,開始實踐下就知道怎么一回事了 alerts 警告框,顯示…

Visual Studio 2019 Qt QML 項目環境搭建常見問題處理方法

在 Visual Studio 2019 運行 Qt/QML 項目比直接使用QtCreator環境麻煩,主要是有qmake 的一些配置項不能在 Visual Studio中設置。下面整理一些常見問題的處理方法,供參考: 搭建VS Qt 環境,在Visual Studios 2019下面安裝 Qt Vis…

【Linux】POSIX信號量與基于環形隊列的生產消費者模型

目錄 一、POSIX信號量: 接口: 二、基于環形隊列的生產消費者模型 環形隊列: 單生產單消費實現代碼: RingQueue.hpp: main.cc: 多生產多消費實現代碼: RingQueue.hpp: main.…

RAG優化:python從零實現GraphRag 一場文檔與知識的“戀愛”之旅

嘿,親愛的算法工程師們,準備好迎接一場文檔與知識的“戀愛”之旅了嗎?今天我們要介紹的 Graph RAG,就像是一位“紅娘”,幫助文檔和知識在圖的世界里找到彼此,擦出智慧的火花! 文章目錄 為什么需要 Graph RAG?Graph RAG 的“戀愛秘籍”準備好了嗎?讓我們開始吧!環境設…

深入 SVG:矢量圖形、濾鏡與動態交互開發指南

1.SVG 詳細介紹 SVG(Scalable Vector Graphics) 是一種基于 XML 的矢量圖形格式,用于描述二維圖形。 1. 命名空間 (Namespace) ★ 了解 命名空間 URI:http://www.w3.org/2000/svg 用途:在 XML 或 XHTML 中區分不同標…

HTTPS 加密過程詳解

HTTPS 的核心組成是 HTTP 協議與 SSL/TLS 加密層的結合,通過加密傳輸、身份驗證和完整性校驗機制,確保數據安全。其加密過程通過以下方式保障數據的機密性、完整性和身份驗證: 一、HTTPS 的核心組成 1. HTTP 協議 作為基礎通信協議&#xf…

嵌入式硬件工程師從小白到入門-速通版(一)

嵌入式硬件工程師從小白到入門:知識點速通與實戰指南 一、基礎硬件知識體系 電子電路基礎 基本概念:電流、電壓、電阻、電容、電感等;電路分析:歐姆定律、基爾霍夫定律、戴維南定理;元器件特性:二極管、三極…

SpringBoot通過Map實現天然的策略模式

😊 作者: 一恍過去 💖 主頁: https://blog.csdn.net/zhuocailing3390 🎊 社區: Java技術棧交流 🎉 主題: SpringBoot通過Map實現天然的策略模式 ?? 創作時間: 202…

WordPress WooCommerce 本地文件包含漏洞(CVE-2025-1661)

免責聲明 僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 一:產品介紹 HUSKY – WooCommer…

matlab近似計算聯合密度分布

在 Matlab 中,當A和B是兩個序列數據時,可以通過以下步驟來近似求出A大于B的概率分布:數據準備:確保序列A和B具有相同的長度。如果長度不同,需要進行相應的處理(例如截取或插值)。計算A大于B的邏…

可視化動態表單動態表單界的天花板--Formily(阿里開源)

文章目錄 1、Formily表單介紹2、安裝依賴2.1、安裝內核庫2.2、 安裝 UI 橋接庫2.3、Formily 支持多種 UI 組件生態: 3、表單設計器3.1、核心理念3.2、安裝3.3、示例源碼 4、場景案例-登錄注冊4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、純 JSX 案例 1、Form…

NAT 實驗:多私網環境下 NAPT、Easy IP 配置及 FTP 服務公網映射

NAT基本概念 定義:網絡地址轉換(Network Address Translation,NAT)是一種將私有(保留)地址轉化為合法公網 IP 地址的轉換技術,它被廣泛應用于各種類型 Internet 接入方式和各種類型的網絡中。作…