将对象组合成树形结构,以表示 部分-整体 的层次结构。使得用户对单个对象和组合对象的使用具有一致性。
是一种 弱的拥有关系
优点:用户可以一致的使用 组合结构和单个对象
应用场景:当需求中体现 部分与整体 的层次结构时,以及你希望用户忽略组合对象与单个对象的不同,统一使用组合中的所有对象时,就应该考虑组合模式。
代码示例
# 抽象类、接口 class Company(object): def __init__(self, name): self.name = name def Add(self,c): pass def Remove(self, c): pass def Display(self,depth): pass def LineOfDuty(self): pass # 具体公司类 class ConcreteCompany(Company): def __init__(self, name): self.name = name self.L = [] def Add(self,c): self.L.append(c) def Display(self,depth): s='-'*depth+self.name print(s) for component in self.L: component.Display(depth+2) def LineOfDuty(self): for component in self.L: component.LineOfDuty() # 人力资源 class HRDepartment(Company): def Add(self,c): pass def Remove(self, c): pass def Display(self,depth): s = '#' * depth + self.name print(s) def LineOfDuty(self): print(self.name, "员工招聘") # 财务部 class FinanceDepartment(Company): def Add(self,c): pass def Remove(self, c): pass def Display(self,depth): s = '#' * depth + self.name print(s) def LineOfDuty(self): print(self.name, "财务收支") root = ConcreteCompany("北京总公司") root.Add(HRDepartment("总公司人力资源部")) root.Add(FinanceDepartment("总公司财务部")) comp = ConcreteCompany("华东分公司") comp.Add(HRDepartment("华东分公司人力资源部")) comp.Add(FinanceDepartment("华东分公司财务部")) root.Add(comp) comp2 = ConcreteCompany("南京办事处") comp2.Add(HRDepartment("南京办事处人力资源部")) comp2.Add(FinanceDepartment("南京公司财务部")) root.Add(comp2) # comp.Add(comp2) # 个人觉得注释 52和57行 结构更清楚 # root.Add(comp) print("公司结构图") root.Display(1) print("部门职责") root.LineOfDuty()