Golang設(shè)計(jì)模式之組合模式講解
組合模式
組合是一種結(jié)構(gòu)型設(shè)計(jì)模式, 你可以使用它將對(duì)象組合成樹(shù)狀結(jié)構(gòu), 并且能像使用獨(dú)立對(duì)象一樣使用它們。
對(duì)于絕大多數(shù)需要生成樹(shù)狀結(jié)構(gòu)的問(wèn)題來(lái)說(shuō), 組合都是非常受歡迎的解決方案。 組合最主要的功能是在整個(gè)樹(shù)狀結(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)文章
通過(guò)Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖
在Web開(kāi)發(fā)中,有時(shí)需要對(duì)網(wǎng)頁(yè)進(jìn)行截圖,以便進(jìn)行頁(yè)面預(yù)覽、測(cè)試等操作,本文為大家整理了Golang實(shí)現(xiàn)無(wú)頭瀏覽器的截圖的方法,感興趣的可以了解一下2023-05-05
淺談Golang中創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器的方法
這篇文章主要介紹了淺談Golang中創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器的方法,golang中的net/http包對(duì)網(wǎng)絡(luò)的支持非常好,這樣會(huì)讓我們比較容易的建立起一個(gè)相對(duì)簡(jiǎn)單的服務(wù)器,有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的詳細(xì)指南
數(shù)據(jù)的持久化是程序中必不可少的,所以編程語(yǔ)言中對(duì)數(shù)據(jù)庫(kù)的操作是非常重要的一塊,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-10-10
在Go中實(shí)現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解
Go是一種功能強(qiáng)大的編程語(yǔ)言,提供了豐富的數(shù)據(jù)結(jié)構(gòu)和算法,堆棧是計(jì)算機(jī)科學(xué)中的基本數(shù)據(jù)結(jié)構(gòu)之一,在本博文中,我們將探討如何在?Go?中實(shí)現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出?(FIFO)?原則2023-10-10
Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理
這篇文章主要介紹了Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理,iota是go語(yǔ)言的常量計(jì)數(shù)器,只能在常量的表達(dá)式中使用,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07

