ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GO 组合模式(Composite Pattern)

2022-04-28 18:00:27  阅读:166  来源: 互联网

标签:Count Composite Pattern ChildCorporation 接口 int64 func GO root


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有