设计模式之组合模式

miloyang
0 评论
/ /
499 阅读
/
2561 字
22 2023-11

简介

组合模式(Composite Pattern)是一种结构型设计模式,旨在允许客户端以统一的方式处理单个对象和对象的组合。组合模式将对象组织成树形结构,使得客户端可以一致地处理单个对象和组合对象。

在组合模式中,有两种主要类型的对象:

  • 叶子对象(Leaf) 叶子对象是组合中的最终节点,它不包含任何其他对象

  • 容器对象(Composite)

    容器对象是具有子对象的节点,它可以包含叶子对象和其他容器对象,形成了树形结构。

jugelizi

我们的车,有很多部件组成,比如轮胎、引擎、座位等等,每一个都是一个单独的叶子对象,而车辆本身就是容器的节点。

Demo

// Component 组件接口
type Component interface {
    Operation()
}

// Leaf 叶子节点(车辆部件)
type Leaf struct {
    Name string
}

func (l *Leaf) Operation() {
    fmt.Printf("Part: %s\n", l.Name)
}

// Composite 容器节点(车辆)
type Composite struct {
    Name     string
    Children []Component
}

func NewComposite(name string) *Composite {
    return &Composite{Name: name, Children: make([]Component, 0)}
}

func (c *Composite) Add(component Component) {
    c.Children = append(c.Children, component)
}

func (c *Composite) Operation() {
    fmt.Printf("Vehicle: %s\n", c.Name)
    for _, child := range c.Children {
        child.Operation()
    }
}

Test

func TestComponent(t *testing.T) {
    // 创建车辆组合
    vehicle := NewComposite("Car")

    // 添加部件
    engine := &Leaf{Name: "Engine"}
    tire := &Leaf{Name: "Tire"}
    seat := &Leaf{Name: "Seat"}

    vehicle.Add(engine)
    vehicle.Add(tire)
    vehicle.Add(seat)

    // 执行操作
    vehicle.Operation()
}

输出:

Vehicle: Car
Part: Engine
Part: Tire
Part: Seat

在这个例子中,Component 是组件接口,包括 Operation 方法。Leaf 是叶子节点的实现,表示车辆的部件。Composite 是容器节点的实现,表示整辆车辆,可以包含多个部件。

通过创建不同的部件,并将它们添加到车辆组合中,我们形成了一辆完整的车辆。Operation 方法用于打印出车辆的层级结构信息。

这个例子中,我们通过组合模式构建了一个简单的车辆组织结构,车辆是容器节点,部件是叶子节点。这种设计使得我们能够方便地处理整辆车辆和车辆的部件,同时保持了代码的灵活性和可维护性。

作用和场景

  • 统一处理单个对象和对象的组合

    组合模式允许客户端一致地处理单个对象和对象的组合,无需在代码中区分它们的具体类型。这简化了客户端的代码,使其更具一致性。

  • 简化客户端代码

    客户端不需要关心处理单个对象和处理组合对象的细节,通过统一的接口进行操作,提高了代码的可读性和可维护性。

  • 支持开闭原则

    容器对象和叶子对象的增加和删除对客户端是透明的,符合开闭原则。可以方便地添加新的组件类型,而无需修改客户端代码。

组合模式适用于对象的层次结构具有树形结构的场景,例如公司组织结构、部件装配等。

当客户端需要一致地处理单个对象和对象的组合时,可以使用组合模式。这在处理树状结构时特别有用。

当对象的多样性主要来自于外部状态,而内部状态对多个对象是相同的,适合使用组合模式。例如,部门和员工的关系,部门是容器对象,员工是叶子对象,他们共享相同的组合结构。

总体而言,组合模式适用于需要构建层次结构、统一处理单个对象和组合对象、支持开闭原则的场景。在这些情况下,组合模式能够提供一种清晰、灵活的设计方案。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步