组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体-部分”的层次结构。组合模式使得用户可以统一地处理单个对象和组合对象。
统一接口:组合模式提供了一个统一的接口来处理单个对象和组合对象,使得客户端代码可以不加区分地对待它们。
灵活组合:可以灵活地组合对象,构建复杂的结构,同时保持代码的简洁和清晰。
增强扩展性:易于增加新的组件,符合开闭原则。
文件系统:文件和文件夹的管理,文件夹可以包含文件和其他文件夹。
图形用户界面:界面元素的组合,如窗口可以包含按钮、文本框等。
组织结构:公司组织结构的表示,部门可以包含员工和其他部门。
下面是一个简单的组合模式示例,模拟一个图形界面,其中图形界面可以包含按钮、文本框等组件,也可以包含其他容器。
package main
import (
"fmt"
)
// Component 定义组件接口
type Component interface {
Render()
}
// Button 按钮组件
type Button struct {
Text string
}
func (b *Button) Render() {
fmt.Printf("Rendering Button: %s\n", b.Text)
}
// TextBox 文本框组件
type TextBox struct {
Text string
}
func (t *TextBox) Render() {
fmt.Printf("Rendering TextBox: %s\n", t.Text)
}
// Container 容器组件,可以包含其他组件
type Container struct {
Components []Component
}
// AddComponent 添加组件到容器中
func (c *Container) AddComponent(component Component) {
c.Components = append(c.Components, component)
}
// Render 渲染容器及其包含的组件
func (c *Container) Render() {
fmt.Println("Rendering Container:")
for _, component := range c.Components {
component.Render()
}
}
func main() {
// 创建按钮和文本框
button := &Button{Text: "Submit"}
textBox := &TextBox{Text: "Enter your name"}
// 创建容器并添加组件
container := &Container{}
container.AddComponent(button)
container.AddComponent(textBox)
// 渲染容器及其包含的组件
container.Render()
}