组合模式(Composite Design Pattern)
组合模式常用于将对象组合成树形结构,用于统一叶子节点和树节点访问,并且可以用于应用某一操作到所有子节点。
在计算机文件系统中,文件夹里面又可以放入文件和文件夹,文件夹和文件就组成了一种递归结构和容器结构。虽然它们的属性有些不同,我们依然可以把文件夹和文件看作同一种类型的对象,它们都属于文件系统中的一个条目,这样可以方便我们递归处理。
代码示例
假如现在我们来画一个窗口,窗口内由各个组件,Logo、登录按钮、取消按钮等:
package composite
import "fmt"
type Widget interface {
Draw()
}
type BaseWidget struct {
Type string
Text string
subWidgets []Widget
}
//添加子组件
func (w *BaseWidget) Add(widget Widget) {
w.subWidgets = append(w.subWidgets, widget)
}
func (w BaseWidget) Draw() {
fmt.Printf("Draw type=%s, text=%s\n", w.Type, w.Text)
for _, widget := range w.subWidgets {
widget.Draw()
}
}
调用:
window := &BaseWidget{Text: "Window", Type: "Form"}
window.Add(BaseWidget{Text: "Logo", Type: "Picture"})
window.Add(BaseWidget{Text: "Login", Type: "Button"})
window.Add(BaseWidget{Text: "Cancel", Type: "Button"})
window.Draw()
// Output:
// Draw type=Form, text=Window
// Draw type=Picture, text=Logo
// Draw type=Button, text=Login
// Draw type=Button, text=Cancel