组合模式也叫作部分-模式整体
将对象组合分类中翻译树形结构以表示“ 部分 ”和“ 整体 ”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
优点:
1,节点增加和减少是非常自由和方便的,这也是树形结构的一大特点;
2,所有节点,不管是分支节点还是叶子结点,不管是调用一个结点,还是调用一个结点群,都是非常方便的。
使用场景:
1,维护部分与整体的逻辑关系,或者动态调用整体或部分的功能接口,可以考虑使用组合模式。例如,非常多的操作系统(如Linux)都把文件系统设计成树形结构,再比如说分布式应用中借助动物园管理员,也可以组织和调用分布式集群中的结点功能。
缺点
1,由于叶子结点和分支结点直接使用了实现类,而不方便使用抽象类,这大大限制了接口的影响范围;若结点接口发生变更,对系统造成的风险会比较大。
流程图:
蟒蛇代码实现:
“””
组合模式
“””
#树形的公司结构
class公司:
name =''
def __init __(self,name):
self.name = name
def add(self,company):
通过
def remove(self,company):
通过
def display(self,depth):
通过
def listDuty(self):
通过
class ConcreteCompany(Company):
childrenCompany = None
def __init__(self, name):
Company.__init__(self,name)
self.childrenCompany = []
def add(self, company):
self.childrenCompany.append(company)
def remove(self, company):
self.childrenCompany.remove(company)
def display(self, depth):
print ('-' * depth + self.name)
for component in self.childrenCompany:
component.display(depth+1)
def listDuty(self):
for component in self.childrenCompany:
component.listDuty()
class HRDepartment(Company):
def __init__(self, name):
Company.__init__(self,name)
def display(self, depth):
print ('-' * depth + self.name)
def listDuty(self): #履行职责
print ('%s\t 过户登记和管理.' % self.name)
class FinanceDepartment(Company):
def __init__(self, name):
Company.__init__(self,name)
def display(self, depth):
print ("-" * depth + self.name)
def listDuty(self): #履行职责
print ('%s\t财务管理.' % self.name)
class RdDepartment(Company):
def __init__(self,name):
Company.__init__(self,name)
def display(self, depth):
print ("-" * depth + self.name)
def listDuty(self):
print ("%s\t研发." % self.name)
# 总公司下设东边的分公司一个,东边的分公司下设东北公司和东南公司,
# 显示公司层级,并罗列这些的公司中各部门的职责,
if __name__=="__main__":
root = ConcreteCompany('总公司')
root.add(HRDepartment('总部人力资源'))
root.add(FinanceDepartment('总部财务'))
root.add(RdDepartment("总部研发"))
comp = ConcreteCompany('东边分公司')
comp.add(HRDepartment('东边分公司。人力资源'))
comp.add(FinanceDepartment('东边分公司.财政'))
comp.add(RdDepartment("东边分公司.研发"))
root.add(comp)
comp1 = ConcreteCompany('东北 分公司')
comp1.add(HRDepartment('东北.人力资源'))
comp1.add(FinanceDepartment('东北.财政'))
comp1.add(RdDepartment( “东北。研发”))
comp.add(COMP1)
comp2 = ConcreteCompany('东南分公司')
comp2.add(HRDepartment( '东南。人力资源'))
comp2.add(FinanceDepartment( '东南。财政'))
comp2.add(RdDepartment( “东南。研发”))
comp.add(COMP2)
root.display(1)
root.listDuty()