组合模式

 

 

将对象组合成树形结构,以表示 部分-整体 的层次结构。使得用户对单个对象和组合对象的使用具有一致性
是一种 弱的拥有关系 
优点:用户可以一致的使用 组合结构和单个对象
应用场景:当需求中体现 部分与整体 的层次结构时,以及你希望用户忽略组合对象与单个对象的不同,统一使用组合中的所有对象时,就应该考虑组合模式。

 

代码示例

# 抽象类、接口
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()

 

 

posted @ 2017-09-16 15:39  跟随心走  阅读(118)  评论(0编辑  收藏  举报