定义
组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性,又称为整体-部分模式。
优点
- 组合模式在解决有层级关系时,有着得天独厚的优势。思路清晰、代码优雅。
- 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
- 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
缺点
- 使得设计更加复杂,客户端需要花更多时间理清类之间的层次关系。
- 在增加新构件时很难对容器中的构件类型进行限制。
场景
- 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
代码
package Composite
import "fmt"
type Component interface {
Traverse()
}
type Leaf struct {
value int
}
func NewLeaf(value int) *Leaf {
return &Leaf{value: value}
}
func (l *Leaf) Traverse() {
fmt.Println(l.value)
}
type Composite struct {
children []Component
}
func NewComposite() *Composite {
return &Composite{children: make([]Component, 0)}
}
func (c *Composite) Add(component Component) {
c.children = append(c.children, component)
}
func (c *Composite) Traverse() {
for idx, _ := range c.children {
c.children[idx].Traverse()
}
}
package Composite
import (
"testing"
)
func TestComposite_Traverse(t *testing.T) {
containers := make([]Composite, 4)
for i := 0; i < 4; i++ {
for j := 0; j < 3; j++ {
containers[i].Add(NewLeaf(i*3 + j))
}
}
for i := 1; i < 4; i++ {
containers[0].Add(&containers[i])
}
containers[0].Traverse()
}
其他设计模式