Go设计模式11-组合模式
序
- Go 设计模式实现,包含常见的设计模式实现,同时这也是 极客时间-设计模式之美 的笔记,源课程采用 Java 实现,本系列会采用 Go 实现
- 课程: 53 | 组合模式:如何设计实现支持递归遍历的文件系统目录树结构?
- 本文代码仓库: https://github.com/mohuishou/go-design-pattern 🌟🌟🌟🌟🌟
- RoadMap: 11/22 持续更新中,预计一周更新 2 ~ 3 种设计模式,预计到 202010 月底前更新完成
- 获取更新: Github、知乎、RSS、开发者头条**
笔记
代码实现
公司的人员组织就是一个典型的树状的结构,现在假设我们现在有部分,和员工,两种角色,一个部门下面可以存在子部门和员工,员工下面不能再包含其他节点。
我们现在要实现一个统计一个部门下员工数量的功能
Code
package composite
// IOrganization 组织接口,都实现统计人数的功能
type IOrganization interface {
Count() int
}
// Employee 员工
type Employee struct {
Name string
}
// Count 人数统计
func (Employee) Count() int {
return 1
}
// Department 部门
type Department struct {
Name string
SubOrganizations []IOrganization
}
// Count 人数统计
func (d Department) Count() int {
c := 0
for _, org := range d.SubOrganizations {
c += org.Count()
}
return c
}
// AddSub 添加子节点
func (d *Department) AddSub(org IOrganization) {
d.SubOrganizations = append(d.SubOrganizations, org)
}
// NewOrganization 构建组织架构 demo
func NewOrganization() IOrganization {
root := &Department{Name: "root"}
for i := 0; i < 10; i++ {
root.AddSub(&Employee{})
root.AddSub(&Department{Name: "sub", SubOrganizations: []IOrganization{&Employee{}}})
}
return root
}
单元测试
package composite
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestNewOrganization(t *testing.T) {
got := NewOrganization().Count()
assert.Equal(t, 20, got)
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!