文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang怎么实现组合模式和装饰模式

2023-07-04 16:05

关注

今天小编给大家分享一下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 []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 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

以上就是“Golang怎么实现组合模式和装饰模式”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯