组合模式(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

results matching ""

    No results matching ""