Golang实现组合模式和装饰模式
admin
2024-02-15 10:52:05
0

本文介绍组合模式和装饰模式,golang实现两种模式有共同之处,但在具体应用场景有差异。通过对比两个模式,可以加深理解。

组合模式

组合是一种结构设计模式,它允许将对象组合成树状结构,并将其作为单一对象使用。对于需要构建树形结构的大多数问题,组合结构成为常用的解决方案,它最大特性是能够在整个树结构上递归运行方法并对结果进行汇总。

这里通过操作系统的文件系统来理解Composite模式。在文件系统中有两种类型的对象: 文件和文件夹。有些情况下文件和文件夹应该以相同的方式对待。这就是Composite模式派上用场的地方。

假设您需要在文件系统中对特定的关键字进行搜索。此搜索操作同时适用于文件和文件夹。对于一个文件,它只会查看文件的内容;对于一个文件夹,它将遍历该文件夹的所有文件以找到该关键字。下面通过实例进行说明。

component.go

定义节点类型:

package maintype Component interface {search(string)
}

file.go

定义文件类型节点,实现search方法:

package mainimport "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

定义文件夹类型节点,也实现search方法:

package mainimport "fmt"type Folder struct {components []Componentname       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)
}

组合测试

定义main.go文件进行组合测试:

package mainfunc 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")
}

输出结果:

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

装饰模式

装饰模式也是一种结构模式,通过将对象放置在称为装饰器的特殊包装对象中,允许动态地向对象添加新行为。使用装饰器可以无数次包装对象,因为目标对象和装饰器遵循相同的接口。结果对象将获得所有包装器的堆叠行为。下面通过实例进行说明:

pizza.go

定义披萨类型,包括getPrice方法:

package maintype IPizza interface {getPrice() int
}

veggieMania.go

定义素食披萨,并实现getPrice方法:

package maintype VeggeMania struct {
}func (p *VeggeMania) getPrice() int {return 15
}

tomatoTopping.go

定义番茄匹萨,再次对getPrice方法进行装饰:

package maintype TomatoTopping struct {pizza IPizza
}func (c *TomatoTopping) getPrice() int {pizzaPrice := c.pizza.getPrice()return pizzaPrice + 7
}

cheeseTopping.go

定义奶酪匹萨,同时再次对getPrice方法进行装饰:

package maintype CheeseTopping struct {pizza IPizza
}func (c *CheeseTopping) getPrice() int {pizzaPrice := c.pizza.getPrice()return pizzaPrice + 10
}

main.go

下面定义具体实现,展示装饰模式的应用:

package mainimport "fmt"func main() {// 定义匹萨pizza := &VeggeMania{}// 增加奶酪pizzaWithCheese := &CheeseTopping{pizza: pizza,}// 增加番茄pizzaWithCheeseAndTomato := &TomatoTopping{pizza: pizzaWithCheese,}fmt.Printf("Price of veggeMania with tomato and cheese topping is %d\n", pizzaWithCheeseAndTomato.getPrice())
}

输出结果:

Price of veggeMania with tomato and cheese topping is 32

相关内容

热门资讯

有什么科幻小故事,短一些? 有什么科幻小故事,短一些? 遇见外星人一天,我在公园里散步。突然,一个像盘子一样发着许多光的东西...
幼儿园安吉室外投放哪些材料 幼儿园安吉室外投放哪些材料幼儿园安吉室外投放材料滚筒、积木、长板、木箱、梯子、沙水、锅、碗、瓢、盆、...
爱情的十字路口我该怎么选择? 爱情的十字路口我该怎么选择?真爱掌握在你自己手中!爱他就努力争取,不顾一切!还不是很爱他,那就等等,...
有没有和《恶魔狂想曲之明日骄阳... 有没有和《恶魔狂想曲之明日骄阳》差不多精彩的小说?女主角很多,个性鲜明,主角多情但不滥情,富于正义文...
功利主义是否认为道德应该是一种... 功利主义是否认为道德应该是一种绝对的命令?最源头的定义是边沁的观点,使所有人的快乐最大化。之后有缪尔...
什么是CC猫啊 什么是CC猫啊CC是一只可爱活泼的猫猫,因为诞生于沪江网校所以全称:沪江网校CC猫。CC猫常常出没于...
美剧迷失第三季好看吗? 美剧迷失第三季好看吗?个人觉得,迷失第一季还不错,很惊异.越往后看越没意思.相信我你会越看越迷失的....
求推荐一些奇幻和爱情主题的动漫 求推荐一些奇幻和爱情主题的动漫刀剑神域 强烈推荐妖精的尾巴哈尔的移动城堡~~强烈推荐刀剑神域!!!...
张晓风的这篇柳运用什么的修辞手... 张晓风的这篇柳运用什么的修辞手法张晓风的这片《柳》运用了比喻,对比的修辞手法。希望我的解答对我有帮助...
我想在手机上看童话书,请问在哪... 我想在手机上看童话书,请问在哪里找?我记得有类似的书,是不是一本红皮的?那个是有点类似杂志或者丛书的...
远古是一个怎样的世界 远古是一个怎样的世界漫漫四十多亿年哪,多长的时间呀,搞不好,以前主宰地球的物种的科技比我们还牛些的!...
有色没胆 有胆没色 有色没胆 有胆没色这两种男人有什么区别?哦这个.有色就是好色也不敢动手.有胆就是胆大不好色.或者是自...
华胥引中君伟的结局 华胥引中君伟的结局君玮最后是和苏仪在一起了。七七微段子里提到的慕言和阿拂家的孩子其实是君玮和苏仪的然...
带烁字的男孩名字 带烁字的男孩名字带烁字的男孩名字,用烁字起名烁(shuò):烁表示光亮、烁亮、烁烁。 繁体:烁;部首...
《披荆斩棘的哥哥》正在热播,看... 《披荆斩棘的哥哥》正在热播,看完这档节目后你有什么观后感?看完这档节目之后,我觉得挺好的,这次的节目...
我女儿的生辰八字:壬午年 丙... 我女儿的生辰八字:壬午年 丙午月 丙寅日 庚寅时 (2002年6月27日农历五月十七日早上...
点读机什么品牌好啊,怎么选啊? 点读机什么品牌好啊,怎么选啊?步步高点读机比较好,选大商场的正品,不要上网或电子市场买。
吴用只是个文弱书生,李逵为何会... 吴用只是个文弱书生,李逵为何会对他言听计从?尽管吴用只是一个文弱书生,但他对李逵忠心耿耿,所以李逵会...
开心星星球里甜心超人魔方玩了4... 开心星星球里甜心超人魔方玩了4秒是哪一集39集,新人。。。第四部《甜心超人的新爱好》
为什么会乐极生悲? 为什么会乐极生悲?从易经的观点看,任何事物都是相对立的。有生就有死,又高就有矮,有长久有段,同样,有...