其他分享
首页 > 其他分享> > GO 组合模式(Composite Pattern)

GO 组合模式(Composite Pattern)

作者:互联网

GO 组合模式(Composite Pattern)


1. 组件 (Component) 接口描述了树中简单项目和复杂项目所共有的操作。

2. 叶节点 (Leaf) 是树的基本结构, 它不包含子项目。
   一般情况下, 叶节点最终会完成大部分的实际工作, 因为它们无法将工作指派给其他部分。

3. 容器 (Container)——又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。 
   容器不知道其子项目所属的具体类, 它只通过通用的组件接口与其子项目交互。
   容器接收到请求后会将工作分配给自己的子项目, 处理中间结果, 然后将最终结果返回给客户端。

4. 客户端 (Client) 通过组件接口与所有项目交互。 因此, 客户端能以相同方式与树状结构中的简单或复杂项目交互。

组合模式适合应用场景

1. 如果你需要实现树状对象结构, 可以使用组合模式。

2. 组合模式为你提供了两种共享公共接口的基本元素类型: 简单叶节点和复杂容器。 容器中可以包含叶节点和其他容器。 这使得你可以构建树状嵌套递归对象结构。

3. 如果你希望客户端代码以相同方式处理简单和复杂元素, 可以使用该模式。

4. 组合模式中定义的所有元素共用同一个接口。 在这一接口的帮助下, 客户端不必在意其所使用的对象的具体类。

组合模式优缺点

优点:

1. 你可以利用多态和递归机制更方便地使用复杂树结构。

2. 开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。

缺点:

1. 对于功能差异较大的类, 提供公共接口或许会有困难。 在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。

DEMO


package main

import (
	"fmt"
	"strconv"
)

// 机构人员组织关系中有两种类型的对象: 人员和机构。 在某些情形中, 人员和机构应被视为相同的对象。 这就是组合模式发挥作用的时候了。

// 假设我们需要在机构中统计人数。 这一搜索操作需要同时作用于机构和人员上。 对于人员而言, 其只会统计人员数量; 对于机构则会统计在其内部的所有人员数量。

// 组件(Component):一个接口,定义了组装体和叶子对象的共同操作
type ICorporation interface {
	// 统计人数
	Count() int64

	// 机构层级
	// ...
}

// 组装体(Composite):Component接口的实现,包含了一组子组件
//
// 机构
type Corporation struct {
	Id     int64   // 机构id
	Name   string  // 机构名
	ChildCorporation []ICorporation // 子节点
}

func (c *Corporation) Count() int64 {
	var count int64

	for _, corp := range c.ChildCorporation {
		count += corp.Count()
	}

	return count
}

func (c *Corporation) Add(child ICorporation)  {
	c.ChildCorporation = append(c.ChildCorporation, child)
}


// 叶子(Leaf):树结构中最基础的对象,也实现了Component接口
type Staff struct {
	Id   int64  // 人员id
	Name string // 人员名
}

func (s *Staff) Count() int64 {
	return 1
}

func NewCorporation() ICorporation {
	root := &Corporation{
		Id:               1,
		Name:             "root",
		ChildCorporation: nil,
	}
	for i := 0; i < 10; i++ {
		root.Add(&Staff{
			Id:   int64(i),
			Name: "staff_" + strconv.Itoa(i),
		})
		root.Add(&Corporation{Id: int64(i)*100,  Name: "sub_" + strconv.Itoa(i), ChildCorporation: nil})
	}

	return root
}

func main() {
	// 构建机构组织架构
	c := NewCorporation()

	fmt.Println(c.Count())
}

标签:Count,Composite,Pattern,ChildCorporation,接口,int64,func,GO,root
来源: https://www.cnblogs.com/dibtp/p/16203899.html