Golang实现组合模式和装饰模式实例详解

 更新时间:2022年11月26日 16:40:00   作者:梦想画家  
这篇文章主要介绍了Golang实现组合模式和装饰模式,本文介绍组合模式和装饰模式,golang实现两种模式有共同之处,但在具体应用场景有差异。通过对比两个模式,可以加深理解,需要的朋友可以参考下

本文介绍组合模式和装饰模式,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组合模式和装饰模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Go 每日一库之termtables的使用

    Go 每日一库之termtables的使用

    本文主要介绍了Go 每日一库之termtables的使用,termtables处理表格形式数据的输出。是一个很小巧的工具库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Go语言题解LeetCode268丢失的数字示例详解

    Go语言题解LeetCode268丢失的数字示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode268丢失的数字示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 通过示例深度理解Go channel range

    通过示例深度理解Go channel range

    这篇文章主要为大家介绍了Go channel range使用示例深度理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言七篇入门教程六网络编程

    Go语言七篇入门教程六网络编程

    这篇文章主要为大家介绍了Go语言的网络编程,其中包含了Socket编程,Http编程以及RPC编程,本篇文章是Go语言七篇入门系列文章,有需要的朋友可以借鉴下
    2021-11-11
  • Golang中errgroup的常见误用详解

    Golang中errgroup的常见误用详解

    errgroup和sync.WaitGroup类似,都可以发起执行并等待一组协程直到所有协程运行结束,本文主要为大家整理了一些errgroup的常见误用,有需要的可以参考下
    2024-01-01
  • Go用两个协程交替打印100以内的奇偶数的方法详解

    Go用两个协程交替打印100以内的奇偶数的方法详解

    这篇文章主要给大家详细介绍了Go用两个协程交替打印100以内的奇偶数的示例代码,文中给大家介绍了两个实现方法,使用无缓冲的channel和设置GOMAXPROCS=1,介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 一文带你感受Go语言空结构体的魔力

    一文带你感受Go语言空结构体的魔力

    在 Go 语言中,有一种特殊的用法可能让许多人感到困惑,那就是空结构体,本文将对Go空结构体进行详解,准备一杯你最喜欢的饮料或茶,随着本文一探究竟吧
    2023-05-05
  • golang中命令行库cobra的使用方法示例

    golang中命令行库cobra的使用方法示例

    这篇文章主要给大家介绍了关于golang中命令行库cobra的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • golang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • 深入解析Go语言中上下文超时与子进程管理

    深入解析Go语言中上下文超时与子进程管理

    这篇文章小编将通过一个实际问题的案例,和大家深入探讨一下Go语言中的上下文超时和子进程管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论