GoLang设计模式20 - 组合模式

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

定义

组合模式是一种结构型设计模式。

当我们想把一组对象当做一个整体来处理时就可以考虑使用组合模式。

组合模式被视为是接口型设计模式是因为它将一组对象组装为一个树状结构。这个树状结构中的每个独立组件都可以用同样的方式来处理——无论它们是复杂的还是原始的。

以计算机操作系统中的文件系统为例。在文件系统中有文件(File)和文件夹(Folder)两类对象,在常见的各种使用场景中,它们的处理方式都差不多是一样的。接下来我们会依据文件系统对组合模式做更详细的阐释。

什么时候使用

一、当从调用方的角度看来,组装体和独立组件需要以同样的方式来处理时可以使用组合模式

在文件系统中这个例子中,假设我们需要通过关键字来搜索文件。这个搜索操作通常会对文件和文件夹同时进行:

  • 对于一个文件来说,会从文件的内容中进行关键字检索
  • 对于一个文件夹来说,会使用关键字递归遍历检索文件夹中的每个文件

二、当组装体和独立组件可以组成一个树状结构时可以使用组合模式

文件系统中的文件夹和文件显然是可以组成树状结构的。

UML Diagram

类图如下:

介绍下类图中的各个组成部分:

  • 组件(Component):一个接口,定义了组装体和叶子对象的共同操作
  • 组装体(Composite):Component接口的实现,包含了一组子组件
  • 叶子(Leaf):树结构中最基础的对象,也实现了Component接口

文件系统对应的UML类图如下:

代码

Component interface component.go

?

| 123 | type component interface {``search(string)``} |

Composite folder.go

?

| 123456789101112131415 | 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)``} |

Leaf file.go

?

| 1234567891011 | 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``} |

client main.go

?

| 12345678910111213141516 | 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"``)``} |

代码已上传至GitHub: zhyea / go-patterns / composite-pattern

END!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值