Golang設(shè)計(jì)模式之組合模式講解
組合模式
組合是一種結(jié)構(gòu)型設(shè)計(jì)模式, 你可以使用它將對(duì)象組合成樹狀結(jié)構(gòu), 并且能像使用獨(dú)立對(duì)象一樣使用它們。
對(duì)于絕大多數(shù)需要生成樹狀結(jié)構(gòu)的問(wèn)題來(lái)說(shuō), 組合都是非常受歡迎的解決方案。 組合最主要的功能是在整個(gè)樹狀結(jié)構(gòu)上遞歸調(diào)用方法并對(duì)結(jié)果進(jìn)行匯總。
概念示例
讓我們?cè)囍靡粋€(gè)操作系統(tǒng)文件系統(tǒng)的例子來(lái)理解組合模式。 文件系統(tǒng)中有兩種類型的對(duì)象: 文件和文件夾。 在某些情形中, 文件和文件夾應(yīng)被視為相同的對(duì)象。 這就是組合模式發(fā)揮作用的時(shí)候了。
想象一下, 你需要在文件系統(tǒng)中搜索特定的關(guān)鍵詞。 這一搜索操作需要同時(shí)作用于文件和文件夾上。 對(duì)于文件而言, 其只會(huì)查看文件的內(nèi)容; 對(duì)于文件夾則會(huì)在其內(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è)計(jì)模式之組合模式講解的文章就介紹到這了,更多相關(guān)Go組合模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)遺傳算法的實(shí)例代碼
Go 是一個(gè)開源的編程語(yǔ)言,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易。本文將重點(diǎn)介紹如何用Go語(yǔ)言實(shí)現(xiàn)遺傳算法。如果你還沒(méi)有參加過(guò)GoLang Tour,我還建議你快速看一下這門語(yǔ)言的介紹2017-11-11Go并發(fā)同步Mutex典型易錯(cuò)使用場(chǎng)景
這篇文章主要為大家介紹了Go并發(fā)同步Mutex典型易錯(cuò)使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08詳解Golang實(shí)現(xiàn)請(qǐng)求限流的幾種辦法
這篇文章主要介紹了詳解Golang實(shí)現(xiàn)請(qǐng)求限流的幾種辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析
這篇文章主要為大家介紹了go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Go基于struct?tag實(shí)現(xiàn)結(jié)構(gòu)體字段級(jí)別的訪問(wèn)控制
本文將會(huì)基于這個(gè)主題展開,討論Go中的結(jié)構(gòu)體tag究竟是什么,我們?cè)撊绾卫盟?另外,文末還提供了一個(gè)實(shí)際案例,實(shí)現(xiàn)結(jié)構(gòu)體字段級(jí)別的訪問(wèn),幫助我們進(jìn)一步提升對(duì)struct tag的理解2024-02-02