""" 实例 汤宝宝成为了上市集团老总,他们集团有好多好多家分公司... """ from abc import ABC, abstractmethod # 抽象类 class Company(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): name: str children: list[Company] def __init__(self, name: str) -> None: self.name = name self.children = [] def show(self, prefix: str) -> None: print(f"{prefix}{self.name}") for child in self.children: child.show(f"{prefix}-> ") def add(self, company: Company) -> None: self.children.append(company) print(f"在{self.name}下开设了分公司{company.name}") def remove(self, company: Company) -> None: self.children.remove(company) print(f"在{self.name}下关闭了分公司{company.name}") def get_child(self, index: int) -> Company: if index < 0 or index >= len(self.children): raise IndexError("子公司索引超出范围") return self.children[index] 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.remove(head_office.get_child(2)) print("\n") head_office.show("~ ") print("\n") head_office.get_child(0).show("~ ") print("\n=========== 组合模式结束 ===========")