設計模式每日硬核訓練 Day 14:組合模式(Composite Pattern)完整講解與實戰應用

🔄 回顧 Day 13:橋接模式小結

在 Day 13 中,我們學習了橋接模式(Bridge Pattern):

  • 用于將“抽象”與“實現”分離,適用于雙維度變化場景(如圖形類型 × 渲染方式)。
  • 它強調組合替代繼承,解決類爆炸問題,提升系統可擴展性。

今天我們進入一個構建層級結構的重要模式——組合模式(Composite Pattern)

組合模式的目標是:讓你以一致的方式對待單個對象和對象集合(樹形結構)


一、組合模式的核心動機

? 什么是組合模式?

組合模式用于構建樹狀結構的對象系統,例如:

  • 文件夾包含文件和子文件夾
  • UI 容器包含多個控件
  • 公司組織結構:員工 ← 部門 ← 公司

核心哲學:

將對象組成樹形結構,客戶端可以“統一操作”葉子節點與中間節點。


二、UML 結構圖

+----------------+
|   Component    |<------------------------------+
+----------------+                               |
| +operation()   |                               |
+----------------+                               |/\                                        |/  \                                       |
+-------------------+     +---------------------+ |
|  Leaf             |     |  Composite           | |
+-------------------+     +---------------------+ |
| +operation()      |     | +add(Component*)     | || +remove(Component*)  | || +operation()         | |+---------------------+ |

在這里插入圖片描述


三、角色說明

角色職責說明
Component抽象類,統一接口
Leaf葉子節點,實現具體功能,不含子節點
Composite組合節點,內部維護子組件列表

四、C++ 實現:文件系統結構

? 抽象組件接口

class FileSystemNode {
public:virtual void display(int depth = 0) = 0;virtual ~FileSystemNode() = default;
};

? 葉子節點:文件

class File : public FileSystemNode {std::string name_;
public:File(const std::string& name) : name_(name) {}void display(int depth = 0) override {std::cout << std::string(depth, '-') << name_ << std::endl;}
};

? 組合節點:文件夾

class Directory : public FileSystemNode {std::string name_;std::vector<std::unique_ptr<FileSystemNode>> children_;public:Directory(const std::string& name) : name_(name) {}void add(std::unique_ptr<FileSystemNode> node) {children_.emplace_back(std::move(node));}void display(int depth = 0) override {std::cout << std::string(depth, '-') << name_ << "/" << std::endl;for (const auto& child : children_) {child->display(depth + 2);}}
};

? 使用示例

int main() {auto root = std::make_unique<Directory>("root");root->add(std::make_unique<File>("file1.txt"));auto subDir = std::make_unique<Directory>("subdir");subDir->add(std::make_unique<File>("file2.txt"));subDir->add(std::make_unique<File>("file3.txt"));root->add(std::move(subDir));root->display();return 0;
}

輸出:

root/
--file1.txt
--subdir/
----file2.txt
----file3.txt

五、組合模式適用場景

場景對象樹結構說明
操作系統文件系統文件 + 文件夾,操作接口統一
圖形界面控件窗口、容器、按鈕、文本框構成控件樹
公司組織架構CEO → 部門主管 → 員工
報表結構層級表頭、表體、表尾、字段
HTML DOM 樹節點 + 元素 + 屬性

六、優點與缺點總結

? 優點:

  • 統一接口,客戶端無差別調用
  • 樹結構天然適合層次建模
  • 擴展方便,添加新節點只需實現 Component

? 缺點:

  • 違背接口隔離原則:葉子節點和組合節點共用接口,部分函數空實現
  • 調試復雜,結構越深越難定位問題

七、與裝飾器 / 責任鏈等模式對比

模式核心區別類似點
Composite結構樹形,有聚合子對象Component 接口統一
Decorator功能增強,包裹單一對象接口一致、動態組合
Chain責任鏈傳遞,節點決定是否繼續傳遞多節點連接,共同參與處理

八、面試回答模板

“在我們的配置中心中,使用組合模式構建配置節點樹,既可以是葉子屬性(字段),也可以是組合節點(嵌套組)。所有節點都繼承自統一接口,使我們可以用遞歸統一地遍歷配置結構、序列化、驗證,代碼簡潔且擴展性好。”

? 建議突出樹形結構、遞歸遍歷、統一調用等優勢。


九、記憶口訣

“樹形結構走統一,組合調用不分離;葉子整體皆一類,層層嵌套遞歸易。”


十、明日預告:Day 15

享元模式(Flyweight Pattern):通過共享技術減少對象數量,提升內存利用效率。

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

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

相關文章

訊聯桌面TV版apk下載-訊聯桌面安卓電視版免費下載安裝教程

在智能電視的使用過程中&#xff0c;一款好用的桌面應用能極大提升我們的使用體驗。訊聯桌面 TV 版就是這樣一款備受關注的應用&#xff0c;它可以讓安卓電視擁有更個性化、便捷的操作界面。今天&#xff0c;就為大家詳細介紹訊聯桌面 TV 版 apk 的免費下載安裝教程。 一、下載…

Nginx知識點

Nginx發展歷史 Nginx 是由俄羅斯程序員 Igor Sysoev 開發的高性能開源 Web 服務器、反向代理服務器和負載均衡器 &#xff0c;其歷史如下&#xff1a; 起源與早期開發&#xff08;2002 - 2004 年&#xff09; 2002 年&#xff0c;當時 Igor Sysoev 在為俄羅斯門戶網站 Rambl…

uview1.0 tabs組件放到u-popup中在微信小程序中滑塊樣式錯亂

解決思路 重新計算布局信息&#xff1a;在彈窗顯示后重新調用 init 方法來計算組件的布局信息。使用 nextTick&#xff1a;保證在視圖更新之后再進行布局信息的計算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…

騰訊一面-軟件開發實習-PC客戶端開發方向

1.自我介紹就不多贅述了 2. 請介紹一下你的項目經歷 - 介紹了專輯鑒賞項目&#xff0c;前端使用html語言編寫&#xff0c;后端基于http協議使用C語言進行網頁開發。此外&#xff0c;還提及項目中涉及處理多線程問題以及做過內存池管理項目。 3. 項目中HTTP協議是使用庫實現的…

[數據可視化] Datagear使用心得:從數據整備到可視化聯動實踐

Datagear 是一款功能強大的數據可視化與報表工具&#xff0c;在日常數據分析與展示過程中&#xff0c;能有效幫助用戶構建交互式報表與面板。本文結合實際使用場景&#xff0c;總結了在 Datagear 平臺上關于元數據整備、Board 面板設計、圖表嵌入等方面的使用經驗&#xff0c;供…

【音視頻】MP4解封裝

一、概述 實現了讀取mp4文件&#xff0c;提取出h264和aac文件&#xff0c;可以直接播放 二、實現過程 準備文件 在build路徑下添加mp4文件 同時&#xff0c;添加main函數參數&#xff0c;表示輸入文件和輸出文件 打開文件 打開輸入文件&#xff0c;初始化格式上下文 char…

idea2024.1雙擊快捷方式打不開

idea2024.1突然雙擊快捷方式打不開&#xff0c;使用管理員運行也打不開 在安裝的idea路徑下的bin目錄下雙擊打開idea.bat文件&#xff0c;要是打不開使用txt格式打開&#xff0c;打開后在最后一行加上pause&#xff0c;之后保存。 看看報錯信息是不是有一個initializedExcept…

【錯誤記錄】Windows 命令行程序循環暫停問題分析 ( 設置 “ 命令記錄 “ 選項 | 啟用 “ 丟棄舊的副本 “ 選項 | 將日志重定向到文件 )

文章目錄 一、報錯信息二、問題分析1、Windows 命令行的緩沖區機制2、命令記錄設置 三、解決方案1、設置 " 命令記錄 " 選項2、將日志重定向到文件 一、報錯信息 Java 程序中 , 設置 無限循環 , 每次循環 休眠 10 秒后 , 再執行程序邏輯 , 在命令行中打印日志信息 ; …

STM32H5開發陀螺儀LSM6DSV16X(1)----輪詢獲取陀螺儀數據

STM32H5開發陀螺儀LSM6DSV16X.1--輪詢獲取陀螺儀數據 概述視頻教學樣品申請源碼下載硬件準備參考程序通信模式管腳定義IIC通信模式速率新建工程工程模板保存工程路徑芯片配置工程模板選擇時鐘設置UART配置UART屬性配置設置e2studio堆棧e2studio的重定向printf設置R_SCI_UART_Op…

Android端使用無障礙服務實現遠程、自動刷短視頻

最近在做一個基于無障礙自動刷短視頻的APP&#xff0c;需要支持用任意藍牙遙控器遠程控制&#xff0c; 把無障礙服務流程大致研究了一下&#xff0c;從下面3個部分做一下小結。 1、需要可調整自動上滑距離和速度以適配不同的屏幕和應用 智能適配99%機型&#xff0c;滑動參數可…

Spark和Hadoop的區別和聯系

Hadoop 和 Spark 的區別 1. 架構 Hadoop&#xff1a;基于 HDFS&#xff08;分布式文件系統&#xff09;和 MapReduce&#xff08;分布式計算框架&#xff09;。HDFS 負責數據的分布式存儲&#xff0c;而 MapReduce 是其主要的計算框架&#xff0c;通過 Map 和 Reduce 任務進行…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千語。接下來繼續對git的內容進行講解。也是在開發中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目錄在右側哦。 如果需要git命令的詳解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先關閉項目&#xf…

論文閱讀:2023 arxiv A Survey of Reinforcement Learning from Human Feedback

A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速覽 這篇論文是關于“從人類反饋中進行強化學習&#xff08;RLHF&#xff09;”的綜述&#xff0c;核心是講如何讓AI通過人類反…

單片機 + 圖像處理芯片 + TFT彩屏 進度條控件

進度條控件使用說明 概述 本進度條控件基于單片機 RA8889/RA6809 TFT開發&#xff0c;提供了簡單易用的進度顯示功能。控件支持多個進度條同時顯示、自定義顏色、邊框和標簽等特性&#xff0c;適用于需要直觀顯示進度信息的各類應用場景。 特性 支持多個進度條同時顯示可…

數據處理: OPTICS聚類及Python實現

1. 基本原理 OPTICS&#xff08;Ordering Points To Identify the Clustering Structure&#xff09;是一種基于密度的聚類算法&#xff0c;可視為DBSCAN的改進版本。它能夠識別不同密度的簇&#xff0c;并自動發現數據中的層次化聚類結構&#xff0c;適用于復雜分布的數據集…

PyCharm 在 Linux 上的完整安裝與使用指南

PyCharm 在 Linux 上的完整安裝與使用指南—目錄 一、PyCharm 簡介二、下載與安裝1. 下載 PyCharm2. 安裝前的依賴準備3. 安裝步驟方法 1&#xff1a;通過 Snap 安裝&#xff08;推薦&#xff09;方法 2&#xff1a;手動安裝&#xff08;從官網下載 .tar.gz 文件&#xff09;方…

【React】路由器 React-Router

安裝路由模式路由組件和屬性 (Link、NavLink、Outlet、Routes、Navigate、element)路由傳參 ( Hook&#xff1a;useParams 、useSearchParams )路由跳轉&#xff08;Hook&#xff1a;useNavigate&#xff09;路由的構建 前端路由指的是一種將瀏覽器URL與特定頁面或視圖關聯起來…

Flowable7.x學習筆記(十)分頁查詢已部署 BPMN XML 流程

前言 上一篇文章我們已經完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我們要需要明確的指定具體要激活部署后的哪一條流程&#xff0c;所以我們先把已部署的基礎信息以及具體定義信息分頁查詢出來&#xff0c;本文先把基礎代碼生成以及完成分頁…

【論文閱讀23】-地下水預測-TCN-LSTM-Attention(2024-11)

這篇論文主要圍繞利用深度學習模型檢測地下水位異常以識別地震前兆展開。 [1] Chen X, Yang L, Liao X, et al. Groundwater level prediction and earthquake precursor anomaly analysis based on TCN-LSTM-attention network[J]. IEEE Access, 2024, 12: 176696-176718. 期刊…

electron從安裝到啟動再到打包全教程

目錄 介紹 安裝 修改npm包配置 執行安裝命令 源代碼 運行 打包 先安裝git, 安裝打包工具 導入打包工具 執行打包命令 總結 介紹 electron確實好用,但安裝是真的要耗費半條命。每次安裝都會遇到各種問題,然后解決了之后。后面就不需要安裝了,但有時候比如電腦重裝…