網站首頁 編程語言 正文
組合模式
組合是一種結構型設計模式, 你可以使用它將對象組合成樹狀結構, 并且能像使用獨立對象一樣使用它們。
對于絕大多數需要生成樹狀結構的問題來說, 組合都是非常受歡迎的解決方案。 組合最主要的功能是在整個樹狀結構上遞歸調用方法并對結果進行匯總。
概念示例
讓我們試著用一個操作系統文件系統的例子來理解組合模式。 文件系統中有兩種類型的對象: 文件和文件夾。 在某些情形中, 文件和文件夾應被視為相同的對象。 這就是組合模式發揮作用的時候了。
想象一下, 你需要在文件系統中搜索特定的關鍵詞。 這一搜索操作需要同時作用于文件和文件夾上。 對于文件而言, 其只會查看文件的內容; 對于文件夾則會在其內部的所有文件中查找關鍵詞。
file.go: 組件接口
package main import "fmt" type File struct { name string } func (f *File) search(keyword string) { fmt.Printf("Searching for keyword %s in file %s\n", keyword, f.name) } func (f *File) getName() string { return f.name }
folder.go: 組合
package main import "fmt" type Folder struct { components []Component name string } func (f *Folder) search(keyword string) { fmt.Printf("Serching recursively for keyword %s in folder %s\n", keyword, f.name) for _, composite := range f.components { composite.search(keyword) } } func (f *Folder) add(c Component) { f.components = append(f.components, c) }
component.go: 葉子
package main type Component interface { search(string) }
main.go: 客戶端代碼
package main func main() { file1 := &File{name: "File1"} file2 := &File{name: "File2"} file3 := &File{name: "File3"} folder1 := &Folder{ name: "Folder1", } folder1.add(file1) folder2 := &Folder{ name: "Folder2", } folder2.add(file2) folder2.add(file3) folder2.add(folder1) folder2.search("rose") }
output.txt: 執行結果
Serching recursively for keyword rose in folder Folder2
Searching for keyword rose in file File2
Searching for keyword rose in file File3
Serching recursively for keyword rose in folder Folder1
Searching for keyword rose in file File1
原文鏈接:https://ch3nnn.blog.csdn.net/article/details/126966436
相關推薦
- 2022-05-06 golang-操作sqlite3增刪改查
- 2022-04-21 python工廠方法模式原理與實現_python
- 2022-11-21 如何使用正則表達式對輸入數字進行匹配詳解_正則表達式
- 2022-04-25 Golang將Map的鍵值對調的實現示例_Golang
- 2022-07-08 Python數據分析Pandas?Dataframe排序操作_python
- 2022-04-19 Golang語言的多種變量聲明方式與使用場景詳解_Golang
- 2022-12-10 Input系統之InputReader概要性實例分析_Android
- 2022-03-23 Linux和GNU系統的關系詳解_Linux
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支