""" 实例 汤宝宝成为了上市集团老总,他们集团有好多好多家分公司... """ from abc import ABC, abstractmethod # 接口 class component(ABC): name: str @abstractmethod def show(self, prefix: str) -> None: pass # 具体类 class Department(component): name: str 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 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: component) -> None: self.children.append(company) print(f"在{self.name}下开设了{company.name}") def remove(self, company: component) -> None: self.children.remove(company) print(f"在{self.name}下裁撤了{company.name}") def get_child(self, index: int) -> component: if index < 0 or index >= len(self.children): raise IndexError("子公司索引超出范围") return self.children[index] if __name__ == "__main__": print("============= 组合模式 =============") 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("~ ") print("\n") head_office.get_child(0).show("~ ") print("\n=========== 组合模式结束 ===========")