Composite模式是指结构设计模式;在国内被称为“Compositor”。
假设我们正在开发一个应用程序 –相册。用户可以创建文件夹、在其中添加照片以及执行其他操作。您肯定需要能够显示文件夹中的文件数量、所有文件和文件夹的总数。
显然需要使用树,但是如何以简单方便的接口实现树架构呢?复合模式来救援。
我们用我们需要的 dataCount() 方法实现 Component 接口,通过该方法我们将返回文件/目录的数量。让我们创建一个带有接口的 Directory 类,该接口允许您根据模式添加/删除实现 Component 接口的类的实例;这就是 Composite。我们还将创建一个 File 类,用于存储照片卡的字节,继承自 Component,并通过 dataCount 返回 1,表示只有一张照片!
接下来在目录中我们实现 dataCount() 方法 –通过遍历组件数组中的所有元素,将它们的所有 dataCount 相加。
一切准备就绪!
下面是 Go 中的示例:
package main
import "fmt"
type component interface {
dataCount() int
}
type file struct {
}
type directory struct {
c []component
}
func (f file) dataCount() int {
return 1
}
func (d directory) dataCount() int {
var outputDataCount int = 0
for _, v := range d.c {
outputDataCount += v.dataCount()
}
return outputDataCount
}
func (d *directory) addComponent(c component) {
d.c = append(d.c, c)
}
func main() {
var f file
var rd directory
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
fmt.Println(rd.dataCount())
var sd directory
sd.addComponent(f)
rd.addComponent(sd)
rd.addComponent(sd)
rd.addComponent(sd)
fmt.Println(sd.dataCount())
fmt.Println(rd.dataCount())
}
来源
https://refactoring.guru/ru/design-patterns/复合
