组合模式

组合模式概念

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体-部分”的层次结构。组合模式使得用户可以统一地处理单个对象和组合对象。

组合模式的作用

统一接口:组合模式提供了一个统一的接口来处理单个对象和组合对象,使得客户端代码可以不加区分地对待它们。
灵活组合:可以灵活地组合对象,构建复杂的结构,同时保持代码的简洁和清晰。
增强扩展性:易于增加新的组件,符合开闭原则。

应用场景

文件系统:文件和文件夹的管理,文件夹可以包含文件和其他文件夹。
图形用户界面:界面元素的组合,如窗口可以包含按钮、文本框等。
组织结构:公司组织结构的表示,部门可以包含员工和其他部门。

Go 语言实现组合模式的示例

下面是一个简单的组合模式示例,模拟一个图形界面,其中图形界面可以包含按钮、文本框等组件,也可以包含其他容器。

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()
}