mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-25 21:26:03 +03:00
92 lines
1.3 KiB
Go
92 lines
1.3 KiB
Go
package composite
|
|
|
|
import "fmt"
|
|
|
|
type Component interface {
|
|
Parent() Component
|
|
SetParent(Component)
|
|
Name() string
|
|
SetName(string)
|
|
AddChild(Component)
|
|
Print(string)
|
|
}
|
|
|
|
const (
|
|
LeafNode = iota
|
|
CompositeNode
|
|
)
|
|
|
|
func NewComponent(kind int, name string) Component {
|
|
var c Component
|
|
switch kind {
|
|
case LeafNode:
|
|
c = NewLeaf()
|
|
case CompositeNode:
|
|
c = NewComposite()
|
|
}
|
|
|
|
c.SetName(name)
|
|
return c
|
|
}
|
|
|
|
type component struct {
|
|
parent Component
|
|
name string
|
|
}
|
|
|
|
func (c *component) Parent() Component {
|
|
return c.parent
|
|
}
|
|
|
|
func (c *component) SetParent(parent Component) {
|
|
c.parent = parent
|
|
}
|
|
|
|
func (c *component) Name() string {
|
|
return c.name
|
|
}
|
|
|
|
func (c *component) SetName(name string) {
|
|
c.name = name
|
|
}
|
|
|
|
func (c *component) AddChild(Component) {}
|
|
|
|
func (c *component) Print(string) {}
|
|
|
|
type Leaf struct {
|
|
component
|
|
}
|
|
|
|
func NewLeaf() *Leaf {
|
|
return &Leaf{}
|
|
}
|
|
|
|
func (c *Leaf) Print(pre string) {
|
|
fmt.Printf("%s-%s\n", pre, c.Name())
|
|
}
|
|
|
|
type Composite struct {
|
|
component
|
|
childs []Component
|
|
}
|
|
|
|
func NewComposite() *Composite {
|
|
return &Composite{
|
|
childs: make([]Component, 0),
|
|
}
|
|
}
|
|
|
|
func (c *Composite) AddChild(child Component) {
|
|
child.SetParent(c)
|
|
c.childs = append(c.childs, child)
|
|
}
|
|
|
|
func (c *Composite) Print(pre string) {
|
|
fmt.Printf("%s+%s\n", pre, c.Name())
|
|
pre += " "
|
|
for _, comp := range c.childs {
|
|
comp.Print(pre)
|
|
}
|
|
}
|