概念
组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
需求
利用组合模式实现总公司,子公司,部门的关系
UML图
代码
抽象公司类
type Company interface {
Add(company Company)
Remove(company Company)
Display(depth int)
LineOfDuty()
}
子公司类
type ConcreteCompany struct {
Name string
children []Company
}
func (c *ConcreteCompany) Add(company Company) {
c.children = append(c.children, company)
}
func (c *ConcreteCompany) Remove(company Company) {
for i := 0; i < len(c.children); i++ {
if c.children[i] == company {
c.children = append(c.children[:i], c.children[i+1:]...)
}
}
}
func (c *ConcreteCompany) Display(depth int) {
for i := 0; i < depth; i++ {
fmt.Print("-")
}
fmt.Println(c.Name)
for _, child := range c.children {
child.Display(depth + 2)
}
}
func (c *ConcreteCompany) LineOfDuty() {
for _, child := range c.children {
child.LineOfDuty()
}
}
具体部门类
type HRDepartment struct {
Name string
}
func (H *HRDepartment) Add(company Company) {
}
func (H *HRDepartment) Remove(company Company) {
}
func (H *HRDepartment) Display(depth int) {
for i := 0; i < depth; i++ {
fmt.Print("-")
}
fmt.Println(H.Name)
}
func (H *HRDepartment) LineOfDuty() {
fmt.Printf("%v 员工招聘培训管理", H.Name)
fmt.Println()
}
-----------------------------------type FinanceDepartment struct {
Name string
}
func (f *FinanceDepartment) Add(company Company) {
}
func (f *FinanceDepartment) Remove(company Company) {
}
func (f *FinanceDepartment) Display(depth int) {
for i := 0; i < depth; i++ {
fmt.Print("-")
}
fmt.Println(f.Name)
}
func (f *FinanceDepartment) LineOfDuty() {
fmt.Printf("%v 公司财务收支管理", f.Name)
fmt.Println()
}
测试
//组合模式
root := compositePattern.ConcreteCompany{Name: "北京总公司"}
root.Add(&compositePattern.HRDepartment{Name: "总公司人力资源部"})
root.Add(&compositePattern.FinanceDepartment{Name: "总公司财务部"})
comp := compositePattern.ConcreteCompany{Name: "上海华东分公司"}
comp.Add(&compositePattern.HRDepartment{Name: "华东分公司人力资源部"})
comp.Add(&compositePattern.FinanceDepartment{Name: "华东分公司财务部"})
root.Add(&comp)
comp1 := compositePattern.ConcreteCompany{Name: "南京办事处"}
comp1.Add(&compositePattern.HRDepartment{Name: "南京办事处人力资源部"})
comp1.Add(&compositePattern.FinanceDepartment{Name: "南京办事处财务部"})
comp.Add(&comp1)
comp2 := compositePattern.ConcreteCompany{Name: "杭州办事处"}
comp2.Add(&compositePattern.HRDepartment{Name: "杭州办事处人力资源部"})
comp2.Add(&compositePattern.FinanceDepartment{Name: "杭州办事处财务部"})
comp.Add(&comp2)
fmt.Println("结构图:")
root.Display(1)
fmt.Println("职责:")
root.LineOfDuty()