86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
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("=========== 组合模式结束 ===========")
|
|
|
|
}
|