package main import "fmt" /* 实例 汤宝宝成为了上市集团老总,他们集团有好多好多家分公司... */ type component interface { Show(prefix string) getName() string } type Department struct { name string } func (d *Department) Show(prefix string) { fmt.Print(prefix) fmt.Println(d.name) } func (d *Department) getName() string { return d.name } type Company struct { name string children []component } func (c *Company) Show(prefix string) { fmt.Print(prefix) fmt.Println(c.name) for _, child := range c.children { child.Show(prefix + "-> ") } } func (c *Company) getName() string { return c.name } func (c *Company) Add(company component) { c.children = append(c.children, company) fmt.Printf("在%s下开设了%s\n", c.name, company.getName()) } func (c *Company) Remove(company component) { for i, child := range c.children { if child == company { c.children = append(c.children[:i], c.children[i+1:]...) break } } fmt.Printf("在%s下裁撤了%s\n", c.name, company.getName()) } func (c *Company) GetChild(i int) component { if i < 0 || i >= len(c.children) { return nil } return c.children[i] } func main() { fmt.Println("============= 组合模式 =============") headOffice := &Company{name: "汤氏总公司"} headOffice.Add(&Company{name: "汤氏A分公司"}) headOffice.Add(&Department{name: "人事部"}) headOffice.Add(&Department{name: "研发部"}) headOffice.GetChild(0).(*Company).Add(&Department{name: "市场部"}) headOffice.GetChild(0).(*Company).Add(&Department{name: "财务部"}) headOffice.Remove(headOffice.GetChild(2)) fmt.Println() headOffice.Show("~ ") fmt.Println() headOffice.GetChild(0).Show("~ ") fmt.Println() fmt.Println("=========== 组合模式结束 ===========") }