外觀模式C++

外觀模式(Facade Pattern)是一種結構型設計模式,它為復雜系統提供一個簡化的接口,隱藏系統內部的復雜性,使客戶端能夠更輕松地使用系統。這種模式通過創建一個外觀類,封裝系統內部的交互邏輯,客戶端只需與外觀類交互,而無需了解系統內部的細節。

外觀模式的核心角色

  1. Facade(外觀類):提供簡化的接口,封裝系統內部的復雜交互
  2. Subsystem(子系統):由多個類組成的復雜系統,實現具體功能
  3. Client(客戶端):通過外觀類使用系統功能,無需直接與子系統交互

C++實現示例

以下以"家庭影院系統"為例實現外觀模式,家庭影院包含投影儀、音響、播放器等多個設備(子系統),外觀類提供簡化的接口來控制整個觀影流程:

#include <iostream>
#include <string>// 子系統1:投影儀
class Projector {
public:void on() {std::cout << "投影儀開啟" << std::endl;}void off() {std::cout << "投影儀關閉" << std::endl;}void setInput(const std::string& source) {std::cout << "投影儀輸入源設置為: " << source << std::endl;}void setMode(const std::string& mode) {std::cout << "投影儀模式設置為: " << mode << std::endl;}
};// 子系統2:音響
class SoundSystem {
public:void on() {std::cout << "音響開啟" << std::endl;}void off() {std::cout << "音響關閉" << std::endl;}void setVolume(int level) {std::cout << "音響音量設置為: " << level << std::endl;}void setSurroundSound(bool enable) {std::cout << (enable ? "開啟" : "關閉") << "環繞聲" << std::endl;}
};// 子系統3:播放器
class Player {
private:std::string currentMovie;public:void on() {std::cout << "播放器開啟" << std::endl;}void off() {std::cout << "播放器關閉" << std::endl;}void loadMovie(const std::string& movie) {currentMovie = movie;std::cout << "加載電影: " << currentMovie << std::endl;}void play() {std::cout << "播放電影: " << currentMovie << std::endl;}void pause() {std::cout << "暫停播放" << std::endl;}void stop() {std::cout << "停止播放" << std::endl;}
};// 子系統4:燈光
class Lights {
public:void on() {std::cout << "燈光開啟" << std::endl;}void off() {std::cout << "燈光關閉" << std::endl;}void dim(int level) {std::cout << "燈光調暗至 " << level << "% 亮度" << std::endl;}
};// 外觀類:家庭影院外觀
class HomeTheaterFacade {
private:// 持有子系統對象的引用Projector& projector;SoundSystem& soundSystem;Player& player;Lights& lights;public:// 構造函數,接收所有子系統對象HomeTheaterFacade(Projector& p, SoundSystem& s, Player& pl, Lights& l): projector(p), soundSystem(s), player(pl), lights(l) {}// 簡化接口:準備觀影void watchMovie(const std::string& movie) {std::cout << "\n=== 準備開始觀影 ===" << std::endl;lights.dim(10);          // 調暗燈光projector.on();          // 打開投影儀projector.setInput("播放器"); // 設置輸入源projector.setMode("電影模式"); // 設置模式soundSystem.on();        // 打開音響soundSystem.setVolume(8); // 設置音量soundSystem.setSurroundSound(true); // 開啟環繞聲player.on();             // 打開播放器player.loadMovie(movie); // 加載電影player.play();           // 開始播放}// 簡化接口:暫停電影void pauseMovie() {std::cout << "\n=== 暫停觀影 ===" << std::endl;player.pause();          // 暫停播放lights.dim(50);          // 調亮一點燈光}// 簡化接口:結束觀影void endMovie() {std::cout << "\n=== 結束觀影 ===" << std::endl;lights.on();             // 打開燈光player.stop();           // 停止播放player.off();            // 關閉播放器soundSystem.off();       // 關閉音響projector.off();         // 關閉投影儀}
};// 客戶端代碼
int main() {// 創建子系統對象Projector projector;SoundSystem soundSystem;Player player;Lights lights;// 創建外觀對象HomeTheaterFacade homeTheater(projector, soundSystem, player, lights);// 客戶端通過外觀接口操作復雜系統homeTheater.watchMovie("星際穿越");// 模擬觀影過程中暫停homeTheater.pauseMovie();// 繼續播放后結束觀影homeTheater.watchMovie("星際穿越"); // 這里實際應該是繼續播放,簡化處理為重新開始homeTheater.endMovie();return 0;
}

代碼解析

  1. 子系統類ProjectorSoundSystemPlayerLights分別代表家庭影院的各個設備,每個類都有自己的操作接口,構成了復雜系統。

  2. 外觀類HomeTheaterFacade

    • 持有所有子系統對象的引用,封裝了子系統之間的交互邏輯
    • 提供了簡化的接口(watchMoviepauseMovieendMovie),隱藏了系統內部的復雜操作序列
    • 客戶端只需調用這些簡單接口,即可完成復雜的觀影流程
  3. 客戶端交互:客戶端不需要知道各個設備的具體操作,只需通過外觀類的接口與系統交互,大大簡化了使用難度。

外觀模式的優缺點

優點

  • 簡化客戶端操作,隱藏系統內部復雜性
  • 降低客戶端與子系統之間的耦合度,提高系統的獨立性
  • 便于子系統的維護和擴展,符合開放-封閉原則
  • 可以為不同的客戶端提供不同的外觀接口

缺點

  • 外觀類可能會變得龐大,承擔過多責任,成為"上帝類"
  • 新增子系統功能時,可能需要修改外觀類,違反開放-封閉原則
  • 可能限制了客戶端對系統的靈活使用(如需使用子系統的特殊功能)

適用場景

  • 當系統包含多個復雜子系統,希望簡化客戶端使用時
  • 當需要降低客戶端與子系統之間的耦合度時
  • 當需要為一個復雜系統提供多個入口點(不同外觀)時
  • 當維護遺留系統時,可通過外觀類封裝遺留代碼,供新系統調用

常見應用:

  • 框架的入口類(如HttpClient封裝底層網絡操作)
  • 數據庫訪問層(封裝連接、查詢、關閉等操作)
  • 操作系統API封裝(如Win32 API的高層封裝)
  • 第三方庫的適配層(簡化第三方庫的使用)

外觀模式與適配器模式的區別:外觀模式是為了簡化接口,而適配器模式是為了使不兼容的接口兼容;外觀模式針對的是整個系統,而適配器模式針對的是單個類或接口。

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

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

相關文章

Go 微服務限流與熔斷最佳實踐:滑動窗口、令牌桶與自適應閾值

&#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1f680; 每一個算法都是我點燃的推進器&#xff0c;每一行代碼都是我航行的星圖。 &#x…

Java面試寶典:JVM性能優化

一、運行時優化 Java虛擬機(JVM)的運行時優化是提升Java應用性能的核心環節。JIT(Just-In-Time)編譯器在程序運行過程中,通過分析熱點代碼的執行模式,動態地進行一系列高級優化。這些優化技術對開發者透明,但了解其原理能幫助我們編寫出更易于優化的代碼,從而顯著提升…

Day55--圖論--107. 尋找存在的路徑(卡碼網)

Day55–圖論–107. 尋找存在的路徑&#xff08;卡碼網&#xff09; 今天學習并查集。先過一遍并查集理論基礎。再做下面這一道模板題&#xff0c;就可以結束了。體量不多&#xff0c;但是理解并查集&#xff0c;并使用好&#xff0c;不容易。 后續再找相關的題目來做&#xff0…

C++中的鏈式操作原理與應用(三):專注于異步操作延的C++開源庫 continuable

目錄 1.簡介 2.安裝與集成 3.快速入門 4.完整示例 5.優勢與適用場景 1.簡介 continuable 是一個專注于 異步操作延續&#xff08;continuation&#xff09; 的現代 C 開源庫&#xff0c;旨在簡化異步編程流程&#xff0c;解決 “回調地獄” 問題&#xff0c;提供直觀、靈活…

STM32--寄存器與標準庫函數--通用定時器--輸出比較(PWM生成)

目錄 前言 通用定時器類型 向上計數、向下計數、中心對齊 輸入捕獲與輸出比較概念 輸出比較典型例子&#xff1a;驅動舵機旋轉 通用定時器的輸出比較庫函數 代碼 通用定時器的輸出比較寄存器操作 代碼 這里提供數據手冊的寄存器 后言 前言 使用平臺:STM32F407ZET6 使…

91、23種設計模式

設計模式是軟件設計中反復出現的解決方案的模板&#xff0c;用于解決特定問題并提高代碼的可維護性、可擴展性和可復用性。23種經典設計模式可分為創建型、結構型和行為型三大類&#xff0c;以下是具體分類及模式概述&#xff1a; 一、創建型模式&#xff08;5種&#xff09; 關…

力扣(串聯所有單詞的子串)

串聯所有單詞的子串問題&#xff1a;多滑動窗口與哈希表的實戰應用。 一、題目分析&#xff08;一&#xff09;問題定義 給定字符串 s 和字符串數組 words&#xff08;words 中所有單詞長度相同 &#xff09;&#xff0c;找出 s 中所有“串聯子串”的起始索引。串聯子串指包含 …

RH134 管理基本存儲知識點

1. 對 Linux 磁盤進行分區時有哪兩種方案&#xff1f;分別加以詳細說明。答&#xff1a;MBR分區&#xff1a;主引導記錄(MBR)分區方案是運行BIOS固件的系統上的標準方案。此方案支持最 多四個主分區。在Linux系統上&#xff0c;您可以使用擴展分區和邏輯分區來創建最多…

【JS 異步】告別回調地獄:Async/Await 和 Promise 的優雅實踐與錯誤處理

【JS 異步】告別回調地獄&#xff1a;Async/Await 和 Promise 的優雅實踐與錯誤處理 所屬專欄&#xff1a; 《前端小技巧集合&#xff1a;讓你的代碼更優雅高效 上一篇&#xff1a; 【JS 數組】數組操作的“瑞士軍刀”&#xff1a;精通 Array.reduce() 的騷操作 作者&#xff…

23.Linux : ftp服務及配置詳解

Linux &#xff1a; ftp服務及配置詳解 FTP 基本概念 定義&#xff1a;文件傳輸協議&#xff08;File Transfer Protocol&#xff09;&#xff0c;采用 C/S 模式工作。端口&#xff1a; 控制端口&#xff1a;21數據端口&#xff1a;20FTP 工作原理模式工作流程連接發起方主動模…

悲觀鎖樂觀鎖與事務注解在項目實戰中的應用場景及詳細解析

在今天做的項目練習部分中真的學到了很多東西&#xff0c;也補充了許多之前遺漏或是忘記的知識點&#xff0c;但時間精力有限&#xff0c;我就先記錄一下今天用到的一個新東西&#xff0c;悲觀鎖和樂觀鎖。首先給出實際應用背景&#xff1a;在加入鎖和事務注解之前&#xff0c;…

Java構造器與工廠模式(靜態工程方法)詳解

1. 構造器1.1 構造器的核心意義1.1.1 對象初始化構造器在創建對象 (new) 時自動調用, 用于初始化對象的狀態 (如設置字段初始值, 分配資源等)無構造器時: 字段為默認值&#xff08;0/null/false&#xff09;有構造器&#xff1a;確保對象創建后即處于有效狀態1.1.2 強制初始化…

解決jdk初始化運行,防火墻通信選錯專業網絡問題

問題描述新項目添加不同版本的jdk&#xff0c;運行時提示防火墻通信策略&#xff0c;選成專用網絡。其他人訪問后端接口時&#xff0c;提示連接失敗。 解決方案&#xff1a;1、在搜索欄中輸入 防火墻關鍵字&#xff0c;選擇到防火墻和網絡保護2、選擇允許應用通過防火墻3、先點…

【Linux】常用命令(三)

【Linux】常用命令&#xff08;三&#xff09;1. export1.1 原理1.2 常用語法1.3 示例1.4 書中對命令的解釋1.5 生效范圍2. 測試服務地址與其端口能否訪問2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (適用于HTTP/HTTPS 服務)1. export export 是 Linux Shell&#xff…

Pytest項目_day15(yaml)

YAMLYAML是一個對所有編程語言都很友好的數據序列化標準&#xff0c;它是一種直觀的能夠被電腦識別的數據序列化格式&#xff0c;是一種可讀性高且容易被人類閱讀的腳本語言YAML語言的本質是一種通用的數據串行化格式適用場景 可以直接序列化為數組、字典解析成本低專門寫配置文…

審批流程系統設計與實現:狀態驅動、靈活擴展的企業級解決方案

審批流程系統設計與實現&#xff1a;狀態驅動、靈活擴展的企業級解決方案 本文基于實際企業級審批系統源碼&#xff0c;深入解析如何設計高擴展性、強一致性的審批流程引擎&#xff0c;涵蓋狀態機設計、多租戶隔離、文件服務集成等核心實現。 1. 系統設計概覽 審批系統的核心架…

汽車免拆診斷案例 | 2010款奧迪A4L車行駛中發動機偶爾自動熄火

故障現象 一輛2010款奧迪A4L車&#xff0c;搭載CDZ發動機 &#xff0c;累計行駛里程約為18.2萬km。該車行駛中發動機偶爾自動熄火&#xff0c;有時熄火后能夠立即重新起動著機&#xff0c;有時需要等待一會兒才能重新起動著機&#xff0c;故障頻率較低。因該故障在其他維修廠陸…

Liam ERD:自動生成美觀的交互式實體關系圖

Liam ERD 是一個可以快速生成美觀且具有交互性的數據庫實體關系圖&#xff08;ERD&#xff09;的工具&#xff0c;可以幫助用戶實現復雜數據庫結構的可視化。 Liam ERD 是一個免費開源的項目&#xff0c;代碼托管在 GitHub&#xff1a; https://github.com/liam-hq/liam 功能…

網絡協議序列化工具Protobuf

目錄前言一、下載注意二、解壓安裝三、Protobuf的使用1、創建.proto文件2、利用protoc編譯.proto文件前言 Protocol Buffers是Google的?種語??關、平臺?關、可擴展的序列化結構數據的?法&#xff0c;它可?于&#xff08;數據&#xff09;通信協議、數據存儲等。 Protoco…

從表單校驗到API網關:全鏈路輸入安全防護指南

從表單校驗到 API 網關:全鏈路輸入安全防護指南 在軟件系統的安全防御體系中,輸入安全是第一道防線,而這道防線的堅固程度直接決定了系統抵御外部攻擊的能力。從用戶在瀏覽器中填寫表單的那一刻起,到數據經過 API 網關流轉至后端服務,每一個環節都可能成為輸入攻擊的突破…