Go語言設計模式(七)組合模式

組合模式是指將一組相似對象當做一個單一對象的設計模式.

1.組成角色:

1.1組件:

組合中的對象聲明接口,主要用于訪問和管理其子組件.

1.2葉子節點:

定義組合中原始對象行為的類.葉子節點表示組合中的葉對象.

1.3組合:

又稱為容器,存儲子組件并在組件接口中實現與子組件有關的類.

1.4客戶端:

客戶端可以通過組件接口操作組合中的對象.以及與樹形結構中的所有項目交互.

2.使用場景:

2.1需要忽略組合對象和單個對象之間差異時.

2.2需要實現樹形結構時.

2.3客戶端以統一的方式處理簡單或復雜的元素.

3.實現:

3.1組件接口:
// 組件接口
type Component interface {Execute()
}
3.2葉節點類:
// 葉子節點類
type Leaf struct {value int
}// 創建一個新的葉節點對象
func NewLeaf(value int) *Leaf {return &Leaf{value: value}
}// 打印葉節點的值
func (l *Leaf) Execute() {fmt.Println(l.value)
}
3.3組合類:
// 組合類
type Composite struct {children []Component
}// 創建一個新的組合對象
func NewComposite() *Composite {return &Composite{make([]Component, 0)}
}
3.4組合類中添加方法:
// 添加方法
func (c *Composite) Add(component Component) {c.children = append(c.children, component)
}func (c *Composite) Execute() {for _, child := range c.children {child.Execute()}
}
3.5客戶端:
func main() {composite := itboStudy.NewComposite()leaf := itboStudy.NewLeaf(99)leaf1 := itboStudy.NewLeaf(88)leaf2 := itboStudy.NewLeaf(77)composite.Add(leaf)composite.Add(leaf1)composite.Add(leaf2)composite.Execute()
}

4.實戰:

4.1葉子節點:
// 葉子節點類
type Files struct {Name string
}func (f *Files) Search(name string) {fmt.Printf("在文件%s中遞歸搜索%s", f.Name, name)
}func (f *Files) GetName() string {return f.Name
}
4.2組合類:
// 定義組合類.
type Folders struct {Compents []ComponentsName     string
}func (f *Folders) Search(name string) {fmt.Printf("在文件%s中遞歸搜索%s", f.Name, name)for i := range f.Compents {f.Compents[i].Search(name)}
}func (f *Folders) Add(c Components) {f.Compents = append(f.Compents, c)
}
4.3組件接口:
// 定義組件接口
type Components interface {Search(name string)
}
4.4客戶端:
func main() {file1 := &itboStudy.Files{Name: "itboStudy1"}file2 := &itboStudy.Files{Name: "itboStudy2"}file3 := &itboStudy.Files{Name: "itboStudy3"}folders := &itboStudy.Folders{Name: "itboFolder"}folders.Add(file1)folders.Add(file2)folders.Add(file3)folders.Search("99")
}

5.優點:

無須了解構成樹形結構的對象具體類,只需要調用接口方法.

客戶端可以使用組件對象與復合結構中的對象進行交互.

如果調用的是葉子節點對象,可以直接處理請求.

如果調用的組合對象,組合模式會把請求轉發給子組件.

6.缺點:

一旦定義了樹結構,設計會過于籠統.

組合模式很難將樹的組件限制為特定類型.

為了強制執行這種約束,程序必須依賴運行時檢查.組合模式不能使用編程語言的類型系統.

士別三日當刮目相待.

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

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

相關文章

AI 3D 生成工具知識庫:當前產品格局與測評總結

聚焦于 AI 3D 生成領域的領軍產品、功能比較及實測性能。內容分為產品格局、通用功能、測評系統與基準測試,以及單視圖生成實測結果。所有信息基于腳本分析,并交叉驗證了產品名稱、團隊背景(如 VAST AI 的 TripoSR/Meshy 的 Meshy-1、影眸科技…

淘客app的容器化部署與編排:基于Kubernetes的微服務架構實踐

淘客app的容器化部署與編排:基于Kubernetes的微服務架構實踐 大家好,我是阿可,微賺淘客系統及省賺客APP創始人,是個冬天不穿秋褲,天冷也要風度的程序猿! 在淘客app的業務迭代中,傳統物理機部署面…

當GitHub不再純粹:Python自動化測試的未來是AI還是危機?

全球最大的開源代碼平臺,徹底被卷進了AI洪流!作為全球最大的“程序員交友平臺”(手動狗頭),GitHub 可以說是每一個開發者又愛又恨的“家”。沒錯,就是那個全球最大、沒有之一的開源代碼托管平臺&#xff01…

Spring Boot + MySQL 創建超級管理員

Spring Boot系統創建超管實現方式1. 數據庫腳本初始化(最直接的方式)2. Spring Boot 啟動時自動創建(代碼級初始化)2.1 實體類定義2.2 Repository 接口2.3 初始化組件2.4 配置密碼加密器3. 通過接口手動創建(最安全的方…

楊輝三角**

一、題目給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。示例 1:輸入: numRows 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:輸入: numRows 1 輸出: [[1]]提示:1 <…

Vue3 的單文件組件(.vue 文件)中,在 <script>、<template>、<style> 標簽外輸入內容不會導致程序報錯

在 <script>、<template>、<style> 標簽外首行誤輸入內容 vtsvts <script setup lang"ts" name"BaseDocxPreviewDialog"> /*** docx文件預覽模態框組件*/ defineOptions({ name: "BaseDocxPreviewDialog" }); import { …

LVS負載均衡群集和LVS+Keepalived群集

1、群集 1.1群集的含義 由多臺主機構成&#xff0c;但對外只表現為一個整體&#xff0c;只提供一個訪問入口&#xff08;域名與IP地址&#xff09;&#xff0c;相當于一臺大型計算機。 1.2 企業群集分類 負載均衡群集&#xff1a;提高應用系統的響應能力、盡可能處理更多的…

LeetCode力扣-hot100系列(5)

這一篇主要講一講回溯&#xff0c;除了N皇后問題是困難題&#xff0c;不過N皇后知道了咋做也不難。回溯整體上還是好做的&#xff0c;直到套路容易做出來&#xff0c;題目容易理解。回溯[1]全排列問&#xff1a;給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的…

機器學習05——多分類學習與類別不平衡(一對一、一對其余、多對多)

上一章&#xff1a;機器學習04——決策樹 下一章&#xff1a;機器學習06——支持向量機 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、多分類學習&#xff08;一&#xff09;…

2025.9.11總結

閱讀《拿鐵因素》有感昨天看完《拿鐵因素》&#xff0c;這本書讓我明白&#xff0c;如果不去主動去管理自己的財務&#xff0c;解決自己從前的財務問題&#xff0c;我很難過上自己想要的生活。今天就所讀的內容&#xff0c;探究如何將這本書的內容運用到自己的一個日常生活中。…

Android,Jetpack Compose,坦克大戰游戲案例Demo

代碼如下&#xff08;這只是個簡單案例而已&#xff09;&#xff1a; package com.example.myapplicationimport android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Canvas impo…

zookeeper是啥

ZooKeeper是一個開源的分布式協調服務&#xff0c;主要用于解決分布式系統中的數據一致性、狀態同步和協作問題?。它通過提供高可用、強一致性的服務&#xff0c;成為分布式系統的“指揮中心”?。以下是其核心功能和應用場景&#xff1a;核心功能 分布式同步? 通過原子廣播協…

【開題答辯全過程】以 基于Android的智慧旅游APP開發為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

如何選擇?SEO 與 GEO 的 5 個核心分野

在 30 秒內&#xff0c;以下是您需要了解的有關 SEO 和 GEO 之間差異的信息&#xff1a; SEO&#xff08;搜索引擎優化&#xff09;&#xff1a;讓您的網站出現在 Google 搜索中。目標&#xff1a;吸引用戶點擊您的鏈接。GEO&#xff08;生成引擎優化&#xff09;&#xff1a;…

基于MATLAB的光學CCD全息成像仿真程序實現

基于MATLAB的光學CCD全息成像仿真程序實現一、流程 #mermaid-svg-g3dkhZSC3Go4a2kH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g3dkhZSC3Go4a2kH .error-icon{fill:#552222;}#mermaid-svg-g3dkhZSC3Go4a2kH .er…

Java大廠面試實錄:產業互聯網大數據與AI服務場景下的微服務與智能搜索(含詳細解讀)

Java大廠面試實錄&#xff1a;產業互聯網大數據與AI服務場景下的微服務與智能搜索&#xff08;含詳細解讀&#xff09; 場景開場 &#x1f3ed;&#x1f984; 午后陽光正好&#xff0c;王老登背著“Java一把梭”的背包&#xff0c;精神抖擻地走進了產業互聯網大數據與AI服務大廠…

Win_Server遠程桌面(RDP)服務調用GPU并提上傳輸幀率和USB設備重定向

說明&#xff1a;Windows遠程桌面服務&#xff08; RDP &#xff09;&#xff0c;RDP服務是可以無顯卡運行的&#xff0c;顯示遠程桌面的時候并不調用顯卡&#xff0c;可以做一些基本的管理操作&#xff0c;為提升RDP的性能&#xff0c;可以開啟顯卡加速&#xff08; OpenGL&am…

Docker(⑤Kali Linux-HexStrike AI安裝)

卸載 WSL 里的 Ubuntuwsl --unregister Ubuntu查看當前已安裝的發行版wsl --list --verbose下載kali-linuxwsl --install -d kali-linuxKali 服務端安裝sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-venv python3-pip git -y克隆源碼 &am…

查找算法和遞推算法

查找算法題目 1&#xff1a;找班級里的 “小明星”題目描述&#xff1a;班級有 10 個同學的編號&#xff08;1 - 10&#xff09;&#xff0c;輸入一個編號&#xff0c;判斷是否是 “小明星”&#xff08;假設編號為 5 的是小明星&#xff09;&#xff0c;是就輸出 “找到小明星…

2025 年PT展前瞻:人工智能+如何走進普通人的生活?

導讀&#xff1a;2025年&#xff0c;人工智能正在加速融入日常生活&#xff0c;提升著每一個普通人的幸福感與獲得感。清晨&#xff0c;智能手環在你最淺的睡眠階段輕柔震動&#xff0c;用最科學的方式將你喚醒&#xff1b;通勤路上&#xff0c;智能網聯汽車早已規劃好躲避擁堵…