1. design-patterns/

golang 组合模式讲解和代码示例

·221 字·2 分钟· loading
设计模式 设计模式 golang
demo007x
作者
demo007x
设计模式 - This article is part of a series.
Part : This Article

Go 组合模式讲解和代码示例
#

组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。

对于绝大多数需要生成树状结构的问题来说, 组合都是非常受欢迎的解决方案。 组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。

概念示例
#

让我们试着用一个操作系统文件系统的例子来理解组合模式。 文件系统中有两种类型的对象: 文件和文件夹。 在某些情形中, 文件和文件夹应被视为相同的对象。 这就是组合模式发挥作用的时候了。

想象一下, 你需要在文件系统中搜索特定的关键词。 这一搜索操作需要同时作用于文件和文件夹上。 对于文件而言, 其只会查看文件的内容; 对于文件夹则会在其内部的所有文件中查找关键词。

file.go: 组件接口
#

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: 组合
#

package main

import "fmt"

type Folder struct {
	components []Component
	name       string
}

func (f *Folder) search(keyword string) {
	fmt.Printf("searching recursvely for keyword %s in folder %s \n", keyword, f.name)
	for _, component := range f.components {
		component.search(keyword)
	}
}

func (f *Folder) add(c Component) {
	f.components = append(f.components, c)
}

component.go: 叶子
#

 package main

type Component interface {
	search(string)
}

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

output.txt: 执行结果
#

# Type 'dlv help' for list of commands.
searching recursvely for keyword rose in folder Folder2 
searching for keyword rose in file File2
searching for keyword rose in file File3
searching recursvely for keyword rose in folder Folder1 
searching for keyword rose in file File1
Process 60594 has exited with status 0
Detaching
设计模式 - This article is part of a series.
Part : This Article

Related

golang 命令模式讲解和代码示例
设计模式 设计模式 golang
命令是一种行为设计模式, 它可将请求或简单操作转换为一个对象。此类转换让你能够延迟进行或远程执行请求, 还可将其放入队列中。
golang 责任链模式讲解和代码示例
设计模式 设计模式 golang
责任链是一种行为设计模式, 允许你将请求沿着处理者链进行发送, 直至其中一个处理者对其进行处理。该模式允许多个对象来对请求进行处理, 而无需让发送者类与具体接收者类相耦合。 链可在运行时由遵循标准处理者接口的任意处理者动态生成。
golang 生成器模式讲解和代码示例
设计模式 设计模式 golang
生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。