外觀設計模式學習

1.介紹

外觀模式(Facade Pattern) 是一種結構型設計模式,通過提供一個統一的接口,用于訪問子系統中的一組接口,從而簡化客戶端與復雜系統之間的交互。它隱藏了系統的復雜性,使得客戶端只需與一個簡單的接口交互,而無需了解內部的實現細節。

核心思想

  • 簡化接口:外觀模式通過創建一個高級接口,屏蔽了子系統的復雜性。
  • 解耦:客戶端無需直接與子系統的復雜接口交互,減少了系統之間的依賴性。

模式結構

  1. Facade(外觀類):提供一個統一的接口,用來訪問子系統中的功能。
  2. Subsystem(子系統):實現子系統的實際功能,對外隱藏其內部細節。
  3. Client(客戶端):通過外觀類與子系統交互。

外觀模式的缺點

  1. 可能過多依賴:如果外觀類變得過于復雜,可能會導致其自身成為一個“大而全”的類。
  2. 隱藏細節:外觀模式可能會掩蓋子系統的一些細節,從而限制了靈活性。

2.示例

假設我們要實現一個家庭影院系統,它包含多個子系統,如電視、音響、播放器等。客戶端希望通過一個統一的接口來控制整個系統。

#include <iostream>
#include <string>// 子系統1:電視
class Television {
public:void turnOn() { std::cout << "Television is ON\n"; }void turnOff() { std::cout << "Television is OFF\n"; }
};// 子系統2:音響
class SoundSystem {
public:void turnOn() { std::cout << "SoundSystem is ON\n"; }void turnOff() { std::cout << "SoundSystem is OFF\n"; }void setVolume(int level) { std::cout << "SoundSystem volume set to " << level << "\n"; }
};// 子系統3:播放器
class MediaPlayer {
public:void play(const std::string& movie) { std::cout << "Playing movie: " << movie << "\n"; }void stop() { std::cout << "Stopping the movie\n"; }
};// 外觀類
class HomeTheaterFacade {
private:Television tv; // 包含了其他類對象SoundSystem soundSystem;MediaPlayer mediaPlayer;public:void watchMovie(const std::string& movie) {std::cout << "Get ready to watch a movie...\n";tv.turnOn();soundSystem.turnOn();soundSystem.setVolume(50);mediaPlayer.play(movie);}// 直接調用其他接口類void endMovie() {std::cout << "Shutting down the home theater...\n";mediaPlayer.stop();soundSystem.turnOff();tv.turnOff();}
};// 客戶端代碼
int main() {HomeTheaterFacade homeTheater;homeTheater.watchMovie("Inception");homeTheater.endMovie();return 0;
}

3.抽象外觀類

當增加或移除子系統時需要修改外觀類,這違背了“開閉原則”。將外觀類與具體的子系統解耦,通過依賴注入動態管理子系統。這種方式可以在運行時動態增加或移除子系統,而無需修改外觀類的代碼。

#include <iostream>
#include <memory>
#include <unordered_map>
#include <string>// 子系統接口
class Subsystem {
public:virtual void execute() = 0;virtual ~Subsystem() = default;
};// 具體子系統1
class SubsystemA : public Subsystem {
public:void execute() override { std::cout << "SubsystemA executed.\n"; }
};// 具體子系統2
class SubsystemB : public Subsystem {
public:void execute() override { std::cout << "SubsystemB executed.\n"; }
};// 外觀類
class Facade {
private:// 依賴抽象的子系統類std::unordered_map<std::string, std::shared_ptr<Subsystem>> subsystems;public:void addSubsystem(const std::string& name, std::shared_ptr<Subsystem> subsystem) {subsystems[name] = subsystem;}void removeSubsystem(const std::string& name) {subsystems.erase(name);}void executeSubsystem(const std::string& name) {if (subsystems.count(name)) {subsystems[name]->execute();} else {std::cout << "Subsystem " << name << " not found.\n";}}
};// 客戶端代碼
int main() {Facade facade;// 動態添加子系統facade.addSubsystem("A", std::make_shared<SubsystemA>());facade.addSubsystem("B", std::make_shared<SubsystemB>());// 調用子系統facade.executeSubsystem("A");facade.executeSubsystem("B");// 動態移除子系統facade.removeSubsystem("A");facade.executeSubsystem("A");return 0;
}

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

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

相關文章

基于單片機的數字氣壓計設計

摘要:在嵌入式技術快速發展過程中&#xff0c;智能測量儀器被廣泛應用于工業生產以及人們日常生活領域。數字氣壓計在實際應用中&#xff0c;利用氣壓傳感器檢測環境中的壓力大小&#xff0c;便于實現對設備進行智能化的控制操作。數字氣壓計在氣象監測、礦產開采、科學實驗等環…

嵌入式軟件C語言面試常見問題及答案解析(三)

嵌入式軟件C語言面試常見問題及答案解析(三) 上一篇已經足夠長了,再長也就有點不禮貌了,所以在這兒繼續來總結分享那個面試中遇到的題目,文中的問題和提供的答案或者代碼均代表個人的理解,如有不合理或者錯誤的地方,歡迎大家批評指正。 本文中題目列表 1. 編碼實現子串定…

HTML5實現好看的中秋節網頁源碼

HTML5實現好看的中秋節網頁源碼 前言一、設計來源1.1 網站首頁界面1.2 登錄注冊界面1.3 節日由來界面1.4 節日習俗界面1.5 節日文化界面1.6 節日美食界面1.7 節日故事界面1.8 節日民謠界面1.9 聯系我們界面 二、效果和源碼2.1 動態效果2.2 源代碼 源碼下載結束語 HTML5實現好看…

ROS通信編程——服務通信

前言 學完了話題通信其實操作流程基本都已經很熟悉了&#xff0c;因此服務通訊的學習就會流暢許多。 服務通信也是ROS中一種極其常用的通信模式&#xff0c;服務通信是基于請求響應模式的&#xff0c;是一種應答機制。也即: 一個節點A向另一個節點B發送請求&#xff0c;B接收…

零基礎微信小程序開發——全局配置之tabBar(保姆級教程+超詳細)

&#x1f3a5; 作者簡介&#xff1a; CSDN\阿里云\騰訊云\華為云開發社區優質創作者&#xff0c;專注分享大數據、Python、數據庫、人工智能等領域的優質內容 &#x1f338;個人主頁&#xff1a; 長風清留楊的博客 &#x1f343;形式準則&#xff1a; 無論成就大小&#xff0c;…

2024年12月HarmonyOS應用開發者高級認證全新題庫

注意事項&#xff1a;切記在考試之外的設備上打開題庫進行搜索&#xff0c;防止切屏三次考試自動結束&#xff0c;題目是亂序&#xff0c;每次考試&#xff0c;選項的順序都不同&#xff0c;作者已于2024年12月15日又更新了一波題庫&#xff0c;題庫正確率99%&#xff01; 新版…

【網絡協議】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我們學習了 IPv4 地址的分配方式&#xff0c;了解了各種類型的 IPv4 地址&#xff0c;并進行了基礎的子網劃分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我們將繼續學習子網劃分&#xff0c;并引入一些新的概念。 【網絡…

浙江安吉成新的分布式光伏發電項目應用

摘 要&#xff1a;分布式光伏發電站是指將光伏發電組件安裝在用戶的建筑物屋頂、空地或其他適合的場地上&#xff0c;利用太陽能進行發電的一種可再生能源利用方式&#xff0c;與傳統的大型集中式光伏電站相比&#xff0c;分布式光伏發電具有更靈活的布局、更低的建設成本和更高…

7z 安裝與使用指南

文章目錄 1. 安裝 7z1.1 在 Linux 上安裝 7z對于 Debian/Ubuntu 系統&#xff1a;對于 CentOS/RHEL 系統&#xff1a;對于 Fedora 系統&#xff1a;對于 Arch Linux 系統&#xff1a; 1.2 在 Windows 上安裝 7z 2. 使用 7z 進行壓縮和解壓2.1 壓縮文件示例&#xff1a;壓縮一個…

scanf:數據之舟的擺渡人,靜臥輸入港灣的詩意守候

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。* 這一節我們主要來學習scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和賦值…

【ROS2】Arduino系列之電機驅動實現

內容學自&#xff1a;趙虛左老師。學后總結&#xff01; 實現機器人移動的一種策略是&#xff1a;控制系統會先發布預期的車輛速度信息&#xff0c;然后驅動系統訂閱到該信息&#xff0c;不斷調整電機轉速直至達到預期速度&#xff0c;調速過程中還需要時時獲取實際速度并反饋…

119.使用AI Agent解決問題:Jenkins build Pipeline時,提示npm ERR! errno FETCH_ERROR

目錄 1.Jenkins Build時的錯誤 2.百度文心快碼AI智能體幫我解決 提問1&#xff1a;jenkins中如何配置npm的源 提問2&#xff1a;jenkins pipeline 類型為pipeline script from SCM時&#xff0c;如何配置npm源 3.最終解決方法-Jenkinsfile的修改 4.感觸 1.Jenkins Build時…

常見的開源網絡操作系統

常見的開源網絡操作系統有很多,它們通常用于路由器、交換機、網絡設備和服務器等場景,具有靈活、可定制、易于擴展的特點。以下是一些常見的開源網絡操作系統: OpenWRT 用途:主要用于路由器、無線接入點和網絡設備。提供了廣泛的定制選項和高級功能,如防火墻配置、VPN 支持…

Java 日期時間格式化標準

文章目錄 Java日期時間格式化符號ISO 8601中的日期時間ISO 8601標準的定義ISO 8601日期時間格式 周數年份ISO 8601中的周數年份Java中的周數年份 Java跨年日期格式化BUG注意事項 Java日期時間格式化符號 JDK官網截圖&#xff1a; 格式化符號梳理&#xff1a; 符號描述符號用…

【2024華為OD-E卷-200分-數值同化】(題目+思路+JavaC++Python解析)

題目描述 題目名稱&#xff1a;數值同化 題目背景&#xff1a; 在一個數值同化過程中&#xff0c;你需要將一組數值進行特定的處理&#xff0c;使得它們能夠“同化”到一個目標值附近。具體做法是&#xff0c;給定一個數組 nums 和一個目標值 target&#xff0c;你需要對數組…

【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 結課測試

目錄 一 單選 二 多選 三 判斷 四 填空 一 單選 1 一張圖片在存放過程中出現了很多小的噪聲&#xff0c;或白或黑&#xff0c;對其掃描進行以下哪一個操作的去噪效果最好&#xff1f; A.均值濾波 B.中值濾波 C.高斯濾波 D.拉普拉斯濾波 2 以下哪個方法中使用了掩碼語…

ESP32-S3模組上實現低功耗(6)

接前一篇文章:ESP32-S3模組上實現低功耗(5) 本文內容參考: 系統低功耗模式介紹 - ESP32-S3 - — ESP-IDF 編程指南 latest 文檔 電源管理 - ESP32-S3 - — ESP-IDF 編程指南 latest 文檔

chrome瀏覽器的更新提示彈窗無法更新Chrome解決方法

使用組策略編輯器 此方法適用于 Windows 系統且系統為專業版及以上版本&#xff0c;家庭版系統沒有組策略功能。 按下Win R鍵&#xff0c;打開 “運行” 對話框&#xff0c;輸入gpedit.msc并回車&#xff0c;打開組策略編輯器。 在組策略編輯器中&#xff0c;依次展開 “計算機…

高山旅游景區有效降低成本,無人機山下到山上物資吊運技術詳解

在高山旅游景區&#xff0c;傳統的物資運輸方式往往面臨人力成本高昂、效率低下等問題&#xff0c;而無人機技術的引入為這一難題提供了新的解決方案。以下是對無人機從山下到山上進行物資吊運技術的詳細解析&#xff1a; 一、無人機物資吊運技術的優勢 1. 降低人力成本&#…

讀博生涯記錄2 __ 2025.1.8 --- 關于博一上學期的一些經歷和感受

時間過得好快&#xff0c;2024年8月底入學至今都快半年了。學校已經放寒假了&#xff0c;我也計劃過多幾天就回去&#xff0c;在這個太陽早已落山的午后&#xff0c;在這工位區的一隅&#xff0c;想著記錄一下本學期我的一些經歷和感受。 專業上&#xff1a;本學期我給自己的規…