目录
组合模式component.gofile.gofolder.go组合测试装饰模式pizza.goveggieMania.gotomatoTopping.gocheeseTopping.gomain.go本文介绍组合模式和装饰模式,golang实现两种模式有共同之处,但在具体应用场景有差异。通过对比两个模式,可以加深理解。
组合模式
组合是一种结构设计模式,它允许将对象组合成树状结构,并将其作为单一对象使用。对于需要构建树形结构的大多数问题,组合结构成为常用的解决方案,它最大特性是能够在整个树结构上递归运行方法并对结果进行汇总。
这里通过操作系统的文件系统来理解Composite模式。在文件系统中有两种类型的对象: 文件和文件夹。有些情况下文件和文件夹应该以相同的方式对待。这就是Composite模式派上用场的地方。
(资料图片仅供参考)
假设您需要在文件系统中对特定的关键字进行搜索。此搜索操作同时适用于文件和文件夹。对于一个文件,它只会查看文件的内容;对于一个文件夹,它将遍历该文件夹的所有文件以找到该关键字。下面通过实例进行说明。
component.go
定义节点类型:
package main type Component interface { search(string) }
file.go
定义文件类型节点,实现search方法:
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
定义文件夹类型节点,也实现search方法:
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) }
组合测试
定义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") }
输出结果:
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 main type IPizza interface { getPrice() int }
veggieMania.go
定义素食披萨,并实现getPrice方法:
package main type VeggeMania struct { } func (p *VeggeMania) getPrice() int { return 15 }
tomatoTopping.go
定义番茄匹萨,再次对getPrice方法进行装饰:
package main type TomatoTopping struct { pizza IPizza } func (c *TomatoTopping) getPrice() int { pizzaPrice := c.pizza.getPrice() return pizzaPrice + 7 }
cheeseTopping.go
定义奶酪匹萨,同时再次对getPrice方法进行装饰:
package main type CheeseTopping struct { pizza IPizza } func (c *CheeseTopping) getPrice() int { pizzaPrice := c.pizza.getPrice() return pizzaPrice + 10 }
main.go
下面定义具体实现,展示装饰模式的应用:
package main import "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
到此这篇关于Golang实现组合模式和装饰模式的文章就介绍到这了,更多相关go组合模式和装饰模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?