Golang學習筆記_34——組合模式

Golang學習筆記_31——原型模式
Golang學習筆記_32——適配器模式
Golang學習筆記_33——橋接模式


文章目錄

    • 一、核心概念
      • 1. 定義
      • 2. 解決的問題
      • 3. 核心角色
      • 4. 類圖
    • 二、特點分析
    • 三、適用場景
      • 1. 文件系統
      • 2. 圖形界面
      • 3. 組織架構
    • 四、代碼示例(Go語言)
    • 五、高級應用
      • 1. 遞歸統計
      • 2. 組合模式 + 訪問者模式
    • 六、與其他模式對比
    • 七、總結


一、核心概念

1. 定義

組合模式(Composite Pattern)是一種結構型設計模式,通過將對象組織成樹形結構來表示“部分-整體”的層次關系,使客戶端可以統一處理單個對象和組合對象

2. 解決的問題

  • 樹形結構表示:需要處理具有層級關系的對象(如文件系統、組織架構)
  • 統一操作接口:消除客戶端對葉子節點和組合節點的差異感知
  • 遞歸遍歷需求:需要遞歸處理嵌套結構(如計算文件夾總大小)

3. 核心角色

  1. Component(抽象組件)
    定義所有對象的通用接口,聲明管理子組件的方法(如Add()Remove())和業務方法(如Display()

  2. Leaf(葉子節點)
    樹形結構的末端節點,沒有子節點,實現具體業務邏輯

  3. Composite(組合節點)
    包含子節點的容器,實現組件接口并管理子組件集合

4. 類圖

組合模式類圖
示例類圖

二、特點分析

優點

  1. 統一接口
    客戶端無需區分葉子節點和組合節點,簡化調用邏輯

  2. 靈活擴展
    新增組件類型無需修改現有代碼,符合開閉原則

  3. 層次清晰
    天然支持樹形結構表示,便于處理遞歸操作

缺點

  1. 設計復雜度高
    需要定義抽象接口并處理遞歸邏輯,增加實現難度

  2. 類型限制困難
    難以約束容器節點只能包含特定類型子組件

三、適用場景

1. 文件系統

  • 葉子節點:文件
  • 組合節點:文件夾(可包含文件/子文件夾)
  • 操作:遞歸計算總大小、展示目錄結構

2. 圖形界面

  • 葉子節點:按鈕、文本框
  • 組合節點:面板、窗口
  • 操作:統一渲染、事件處理

3. 組織架構

  • 葉子節點:員工
  • 組合節點:部門
  • 操作:統計總人數、打印層級關系

四、代碼示例(Go語言)

package compositedemoimport "fmt"// Component 接口
type Component interface {Display(indent string)
}// Leaf 葉子節點
type File struct {Name string
}func (l *File) Display(indent string) {println(indent + l.Name)
}// Directory 組合節點
type Directory struct {Name      stringComponent []Component
}func (c *Directory) Display(indent string) {println(indent + c.Name)for _, component := range c.Component {component.Display(indent + indent)}
}func (c *Directory) Add(component Component) {c.Component = append(c.Component, component)
}func (c *Directory) Remove(component Component) {for i, v := range c.Component {if v == component {c.Component = append(c.Component[:i], c.Component[i+1:]...)}}
}func test() {root := &Directory{Name: "root"}directory := &Directory{Name: "directory"}file1 := &File{Name: "file1"}file2 := &File{Name: "file2"}root.Add(directory)directory.Add(file1)directory.Add(file2)root.Display("--")fmt.Println("==========================================")directory.Display("**")
}
=== RUN   Test_test
--root
----directory
--------file1
--------file2
==========================================
**directory
****file1
****file2
--- PASS: Test_test (0.00s)
PASS

五、高級應用

1. 遞歸統計

// 在Component接口添加方法
type FileSystemComponent interface {Size() int
}// File實現
func (f *File) Size() int {return 1024 // 假設固定大小
}// Directory實現
func (d *Directory) Size() int {total := 0for _, child := range d.children {total += child.Size()}return total
}

2. 組合模式 + 訪問者模式

通過訪問者模式實現更復雜的樹形結構操作(如格式轉換、權限檢查)

六、與其他模式對比

模式核心目標關鍵區別
裝飾器動態添加功能通過嵌套包裝擴展功能
適配器接口轉換解決接口不兼容問題
迭代器遍歷集合元素專注于遍歷算法實現

七、總結

組合模式通過樹形結構統一接口,有效解決了以下問題:

  1. 層次結構表示:天然適合文件系統、組織架構等場景
  2. 遞歸操作簡化:通過統一接口實現遞歸遍歷
  3. 擴展性提升:新增組件類型不影響現有結構

在Go語言中實現時需注意:

  • 通過接口實現多態特性
  • 使用切片管理子組件集合
  • 謹慎處理葉子節點的無效方法(如Add()

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

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

相關文章

【部署優化篇三】《DeepSeek邊緣計算實戰:把目標檢測模型塞進樹莓派,讓AI在巴掌大的設備上“開天眼“》

“誰說只有超級計算機才能跑AI?今天咱們就要在樹莓派上玩轉DeepSeek目標檢測,讓這個巴掌大的小盒子變成會‘看’世界的智能終端!” 本文手把手教你從零開始,把最潮的目標檢測模型塞進樹莓派。全程高能預警,建議準備好你的樹莓派4B/5和散熱風扇,咱們這就開啟邊緣計算的魔法…

Django中數據庫遷移命令

在 Django 中,數據庫遷移是確保數據庫結構與 Django 模型定義保持一致的重要過程。以下是 Django 中常用的數據庫遷移命令: 1. python manage.py makemigrations 功能:此命令用于根據 Django 項目的模型文件(models.py&#xff…

2023年河北省職業院校技能大賽網絡系統管理賽項樣題解法

? 有問題請留言或主頁私信咨詢 配置文件有部分測試時的冗余配置無視即可。 解法只有大致解法,并不完整。請參考配置,自己補全 基礎配置 1.所有交換機和無線控制器開啟SSH服務,用戶名密碼分別為admin、admin1234;密碼為明文類…

React之旅-02 創建項目

創建React項目,常用的方式有兩種: 官方提供的腳手架,官網:https://create-react-app.dev/。如需創建名為 my-app 的項目,請運行如下命令: npx create-react-app my-app 使用Vite包,官網&…

Visual Studio Code的下載安裝與漢化

1.下載安裝 Visual Studio Code的下載安裝十分簡單,在本電腦的應用商店直接下載安裝----注意這是社區版-----一般社區版就足夠用了---另外注意更改安裝地址 2.下載插件 重啟后就是中文版本了

CAN總線常見的錯誤幀及產生原因

文章目錄 一、位錯誤(Bit Error)1. 表現形式2. 產生原因 二、填充錯誤(Stuff Error)1. 表現形式2. 產生原因 三、CRC 錯誤(CRC Error)1. 表現形式2. 產生原因 四、格式錯誤(Form Error&#xff…

在項目中調用本地Deepseek(接入本地Deepseek)

前言 之前發表的文章已經講了如何本地部署Deepseek模型,并且如何給Deepseek模型投喂數據、搭建本地知識庫,但大部分人不知道怎么應用,讓自己的項目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…

【擁抱AI】GPT Researcher的誕生

一、GPT Researcher 研究過程總結 GPT Researcher 是一個開源的自主智能體,旨在通過利用人工智能技術實現高效、全面且客觀的在線研究。它通過一系列創新的設計和優化,解決了傳統研究工具(如 AutoGPT)中存在的問題,如…

52款獨特婚禮主題手繪水彩花卉樹葉高清png免摳圖設計素材Floria – Botanical Elements

Floria 是一個獨特的系列,由郁郁蔥蔥的植物元素組成,以繪畫風格手繪。它們非常適合任何設計項目 – 包裝、網站、博客、文具等等! 在 Photoshop 中輕松更改顏色,并將其圖層添加到任何紋理或顏色上。擁有 52 種花卉元素&#xff0c…

python入門筆記4

Python 中的列表(List)是 有序、可變 的序列類型,用方括號 [] 定義。以下是列表的核心語法和常用操作: list1 [Google, W3Cschool, 1997, 2000] list2 [7, 2, 3, 4, 5, 6, 1 ] #索引操作 print ("list1 first: ", li…

基于Ubuntu+vLLM+NVIDIA T4高效部署DeepSeek大模型實戰指南

一、 前言:擁抱vLLM與T4顯卡的強強聯合 在探索人工智能的道路上,如何高效地部署和運行大型語言模型(LLMs)一直是一個核心挑戰。尤其是當我們面對資源有限的環境時,這個問題變得更加突出。原始的DeepSeek-R1-32B模型雖…

Linux環境Docker使用代理推拉鏡像

閑扯幾句 不知不覺已經2月中了,1個半月忙得沒寫博客,這篇其實很早就想寫了(可追溯到Docker剛剛無法拉鏡像的時候),由于工作和生活上的事比較多又在備考軟考架構,拖了好久…… 簡單記錄下怎么做的&#xf…

撕碎QT面具(6):調節窗口大小后,控件被擠得重疊的解決方法

問題:控件重疊 分析原因:因為設置了最小大小,所以界面中的大小不會隨窗口的變化而自動變化。 處理方案:修改mimumSize的寬度與高度為0,并設置sizePolicy為Expanding,讓其自動伸縮。 結果展示(自…

Mysql測試連接失敗

解決方案 1 將mysql.exe(C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe)配置到系統環境變量 2 管理員權限啟動cmd 輸入 3 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; 4 FLUSH PRIVILEGES;

【UCB CS 61B SP24】Lecture 3 - Lists 1: References, Recursion, and Lists學習筆記

本文開坑伯克利 CS 61B(算法與數據結構)2024年春季課程學習筆記,Lecture 1 & Lecture 2 的內容為課程介紹與 Java 基礎,因此直接跳過。本文內容為介紹基本數據類型與引用數據類型的區別,以及手動實現整數列表。 1…

每日學習Java之一萬個為什么

9.Class <?> class1 Myclass.class 為什么要有通配符&#xff1f;傳給誰用的&#xff1f; 首先&#xff0c;這里的class特指某個對象在JVM中的元數據集合。 有普通、接口、數組、基本類型、 void 類型、局部類、匿名類、枚舉、注解 1.類型安全&#xff1a;通配符允許…

【算法】787. 歸并排序

題目 歸并排序 思路 和快排一樣&#xff0c;先判斷數據是否沒有或者只為一個&#xff1b;如果大于一個&#xff0c;取中間的值一分為二&#xff0c;然后兩邊遞歸&#xff0c;歸并的實質是把兩個有序數組排成一個&#xff0c;兩個數組都從頭開始比較&#xff0c;把更小的取下…

濾波器 | 原理 / 分類 / 特征指標 / 設計

注&#xff1a;本文為 “濾波器” 相關文章合輯。 未整理去重。 淺談濾波器之 —— 啥是濾波器 原創 RF 小木匠 射頻學堂 2020 年 03 月 25 日 07:46 濾波器&#xff0c;顧名思義&#xff0c;就是對信號進行選擇性過濾&#xff0c;對不需要的信號進行有效濾除。按照其傳輸信…

DeepSeek-學習與實踐

1.應用場景 主要用于學習與使用DeepSeek解決問題, 提高效率. 2.學習/操作 1.文檔閱讀 文檔 DeepSeek -- 官網, 直接使用 --- 代理網站 --- 極客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的資料 資料 20250209DeepSeekC…

分布式架構與XXL-JOB

目錄 先了解什么是任務調度&#xff1f; 什么是分布式任務調度&#xff1f; 了解XXL-JOB分布式任務調度平臺 如何搭建XXL-JOB&#xff1f; 分片廣播 作業分片方案 最近學習在項目的媒資管理模塊如何高效處理大量視頻&#xff0c;上傳單個視頻可能涉及到轉碼&#xff0c…