diff --git a/go/composite/main.go b/go/composite/main.go index 660d56d..b63862c 100644 --- a/go/composite/main.go +++ b/go/composite/main.go @@ -7,25 +7,30 @@ import "fmt" 汤宝宝成为了上市集团老总,他们集团有好多好多家分公司... */ -// 抽象接口 -type Company interface { - // 显示公司名称 +type component interface { Show(prefix string) - // 开设分公司 - Add(company Company) - // 分公司关门 - Remove(company Company) - // 获取分公司 - GetChild(i int) Company + getName() string } -// 具体实现类 -type ConcreteCompany struct { +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 []Company + children []component } -func (c *ConcreteCompany) Show(prefix string) { +func (c *Company) Show(prefix string) { fmt.Print(prefix) fmt.Println(c.name) for _, child := range c.children { @@ -33,22 +38,26 @@ func (c *ConcreteCompany) Show(prefix string) { } } -func (c *ConcreteCompany) Add(company Company) { - c.children = append(c.children, company) - fmt.Printf("在%s下开设了分公司%s\n", c.name, company.(*ConcreteCompany).name) +func (c *Company) getName() string { + return c.name } -func (c *ConcreteCompany) Remove(company Company) { +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.(*ConcreteCompany).name) + fmt.Printf("在%s下裁撤了%s\n", c.name, company.getName()) } -func (c *ConcreteCompany) GetChild(i int) Company { +func (c *Company) GetChild(i int) component { if i < 0 || i >= len(c.children) { return nil } @@ -58,12 +67,12 @@ func (c *ConcreteCompany) GetChild(i int) Company { func main() { fmt.Println("============= 组合模式 =============") - headOffice := &ConcreteCompany{name: "汤氏总公司"} - headOffice.Add(&ConcreteCompany{name: "汤氏A分公司"}) - headOffice.Add(&ConcreteCompany{name: "汤氏B分公司"}) - headOffice.Add(&ConcreteCompany{name: "汤氏C分公司"}) - headOffice.GetChild(0).Add(&ConcreteCompany{name: "汤氏A分公司-子公司1"}) - headOffice.GetChild(0).Add(&ConcreteCompany{name: "汤氏A分公司-子公司2"}) + 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("~ ") diff --git a/python/composite/main.py b/python/composite/main.py index 7560519..0965269 100644 --- a/python/composite/main.py +++ b/python/composite/main.py @@ -6,32 +6,31 @@ from abc import ABC, abstractmethod -# 抽象类 -class Company(ABC): +# 接口 +class component(ABC): name: str - children: list["Company"] @abstractmethod def show(self, prefix: str) -> None: pass - @abstractmethod - def add(self, company: "Company") -> None: - pass - @abstractmethod - def remove(self, company: "Company") -> None: - pass - - @abstractmethod - def get_child(self, index: int) -> "Company": - pass - - -# 实现类 -class ConcreteCompany(Company): +# 具体类 +class Department(component): name: str - children: list[Company] + + def __init__(self, name: str) -> None: + self.name = name + + def show(self, prefix: str) -> None: + print(f"{prefix}{self.name}") + + # 实现类 + + +class Company(component): + name: str + children: list[component] def __init__(self, name: str) -> None: self.name = name @@ -42,15 +41,15 @@ class ConcreteCompany(Company): for child in self.children: child.show(f"{prefix}-> ") - def add(self, company: Company) -> None: + def add(self, company: component) -> None: self.children.append(company) - print(f"在{self.name}下开设了分公司{company.name}") + print(f"在{self.name}下开设了{company.name}") - def remove(self, company: Company) -> None: + def remove(self, company: component) -> None: self.children.remove(company) - print(f"在{self.name}下关闭了分公司{company.name}") + print(f"在{self.name}下裁撤了{company.name}") - def get_child(self, index: int) -> Company: + def get_child(self, index: int) -> component: if index < 0 or index >= len(self.children): raise IndexError("子公司索引超出范围") return self.children[index] @@ -59,12 +58,14 @@ class ConcreteCompany(Company): if __name__ == "__main__": print("============= 组合模式 =============") - head_office = ConcreteCompany("汤氏总公司") - head_office.add(ConcreteCompany("汤氏A分公司")) - head_office.add(ConcreteCompany("汤氏B分公司")) - head_office.add(ConcreteCompany("汤氏C分公司")) - head_office.get_child(0).add(ConcreteCompany("汤氏A分公司-子公司1")) - head_office.get_child(0).add(ConcreteCompany("汤氏A分公司-子公司2")) + head_office = Company("汤氏总公司") + head_office.add(Company("汤氏A分公司")) + head_office.add(Department("人事部")) + head_office.add(Department("研发部")) + child = head_office.get_child(0) + if isinstance(child, Company): + child.add(Department("市场部")) + child.add(Department("财务部")) head_office.remove(head_office.get_child(2)) print("\n") head_office.show("~ ") diff --git a/ts/src/composite/index.ts b/ts/src/composite/index.ts index d2811fc..c645cad 100644 --- a/ts/src/composite/index.ts +++ b/ts/src/composite/index.ts @@ -3,16 +3,22 @@ 汤宝宝成为了上市集团老总,他们集团有好多好多家分公司... */ -interface Company { +interface component { name: string; - children: Company[]; show(prefix: string): void; - add(company: Company): void; - remove(company: Company): void; - getChild(index: number): Company | undefined; } -class ConcreteCompany implements Company { +class Department implements component { + name: string; + constructor(name: string) { + this.name = name; + } + show(prefix: string): void { + console.log(prefix + this.name); + } +} + +class Company implements component { name: string; children: Company[] = []; constructor(name: string) { @@ -24,18 +30,18 @@ class ConcreteCompany implements Company { child.show(prefix + "-> "); } } - add(company: Company): void { - this.children.push(company); - console.log(`在${this.name}下开设了分公司${company.name}`); + add(company: component): void { + this.children.push(company as Company); + console.log(`在${this.name}下开设了${company.name}`); } - remove(company: Company): void { - const index = this.children.indexOf(company); + remove(company: component): void { + const index = this.children.indexOf(company as Company); if (index !== -1) { this.children.splice(index, 1); } - console.log(`在${this.name}下关闭了分公司${company.name}`); + console.log(`在${this.name}下裁撤了${company.name}`); } - getChild(index: number): Company | undefined { + getChild(index: number): component { return this.children[index]; } } @@ -43,12 +49,15 @@ class ConcreteCompany implements Company { (function () { console.log("============= 组合模式 ============="); - const headOffice = new ConcreteCompany("总公司"); - headOffice.add(new ConcreteCompany("汤氏A分公司")); - headOffice.add(new ConcreteCompany("汤氏B分公司")); - headOffice.add(new ConcreteCompany("汤氏C分公司")); - headOffice.getChild(0)?.add(new ConcreteCompany("汤氏A分公司-子公司1")); - headOffice.getChild(0)?.add(new ConcreteCompany("汤氏A分公司-子公司2")); + const headOffice = new Company("总公司"); + headOffice.add(new Company("汤氏A分公司")); + headOffice.add(new Department("人事部")); + headOffice.add(new Department("研发部")); + const child = headOffice.getChild(0); + if (child instanceof Company) { + child.add(new Department("市场部")); + child.add(new Department("财务部")); + } headOffice.remove(headOffice.getChild(2)!); console.log();