Composite Pattern
组合模式是以树形结构来组织组件完成某个功能。当根节点的某个方法被调用时,会遍历树结构,调用相应的方法。不过具体如何设计是因人而异的。
它突出的是整体和部分的关系。
实现
组合模式的结构中有两种类型,一种是分支节点,它包含了子节点列表,可以往里边添加和删除节点。另一种是叶子节点,叶子节点没有子节点。这两种节点都实现了同一个接口:Component。这个接口只包含了一个方法。(根据实际情况调整)
分支节点还要实现自己的Add,GetChild,Remove方法。
package bridge
type ICoding interface {
WriteName(string) ICoding
WriteCmd(string) ICoding
Compile() AbstractProgram
}
type CodeUtil struct {
code AbstractProgram
}
func (this CodeUtil) WriteName(name string) ICoding {
this.code.Name = name
return this
}
func (this CodeUtil) WriteCmd(cmd string) ICoding {
this.code.Cmd = cmd
return this
}
func (this CodeUtil) Compile() AbstractProgram {
res := AbstractProgram{Name: this.code.Name, Cmd: this.code.Cmd}
return res
}
func (this CodeUtil) GetSingProgram(word string) Sing {
res := Sing{}
res.AbstractProgram = this.WriteName("sing").WriteCmd("sing").Compile()
res.Word = word
return res
}
func (this CodeUtil) GetDogProgram() Dog {
res := Dog{}
res.AbstractProgram = this.WriteName("dog").WriteCmd("dog").Compile()
return res
}
使用
我这里就实现简单的使用方式吧。
package main
import (
"projects/DesignPatternsByGo/structuralPatterns/composite"
"fmt"
)
func main(){
root := composite.NewComponent(func() {
fmt.Println("My name is:"+"root")
},true).(*composite.Composite)
root.Add(composite.NewComponent(func() {
fmt.Println("I'm Leaf.")
},false).(composite.Component))
composite_2 := composite.NewComponent(func() {
fmt.Println("I'm Composite2.")
},true).(*composite.Composite)
composite_2.Add(composite.NewComponent(func() {
fmt.Println("I'm Leaf2.")
},false).(composite.Component))
composite_2.Add(composite.NewComponent(func() {
fmt.Println("I'm Leaf3.")
},false).(composite.Component))
c2 := root.Add(composite_2)
root.Operation()
root.Remove(c2)
root.Operation()
}
Author:寒江雪
Date:2018 03 12