Golang設(shè)計模式之組合模式講解
組合模式
組合是一種結(jié)構(gòu)型設(shè)計模式, 你可以使用它將對象組合成樹狀結(jié)構(gòu), 并且能像使用獨立對象一樣使用它們。
對于絕大多數(shù)需要生成樹狀結(jié)構(gòu)的問題來說, 組合都是非常受歡迎的解決方案。 組合最主要的功能是在整個樹狀結(jié)構(gòu)上遞歸調(diào)用方法并對結(jié)果進行匯總。
概念示例
讓我們試著用一個操作系統(tǒng)文件系統(tǒng)的例子來理解組合模式。 文件系統(tǒng)中有兩種類型的對象: 文件和文件夾。 在某些情形中, 文件和文件夾應(yīng)被視為相同的對象。 這就是組合模式發(fā)揮作用的時候了。
想象一下, 你需要在文件系統(tǒng)中搜索特定的關(guān)鍵詞。 這一搜索操作需要同時作用于文件和文件夾上。 對于文件而言, 其只會查看文件的內(nèi)容; 對于文件夾則會在其內(nèi)部的所有文件中查找關(guān)鍵詞。
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: 執(zhí)行結(jié)果
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
到此這篇關(guān)于Golang設(shè)計模式之組合模式講解的文章就介紹到這了,更多相關(guān)Go組合模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析
這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04Go基于struct?tag實現(xiàn)結(jié)構(gòu)體字段級別的訪問控制
本文將會基于這個主題展開,討論Go中的結(jié)構(gòu)體tag究竟是什么,我們該如何利用它,另外,文末還提供了一個實際案例,實現(xiàn)結(jié)構(gòu)體字段級別的訪問,幫助我們進一步提升對struct tag的理解2024-02-02