组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
在Component中申明所有用来管理子对象的方法,Add,Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶子节点和枝干节点对于外界没有区别,它们具备完全一致的行为接口。
需求中体现部分与整体层次结构时,而且希望忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。
Python示例:
from abc import ABCMeta, abstractmethod
class AbsDepartment():
__metaclass__ = ABCMeta
@abstractmethod
def Work(self):
pass
@abstractmethod
def Add(self):
pass
@abstractmethod
def Del(self):
pass
class IndependentDepartment(AbsDepartment):
def __init__(self,Name,WorkDetail):
self._Name=Name
self._WorkDetail=WorkDetail
def Work(self):
print self._Name + 'wrok:' + self._WorkDetail
def Add(self):
print 'IndependentDepartment Can not Add Sub'
def Del(self):
print 'IndependentDepartment Can no Del Sub'
class DepartMent(AbsDepartment):
def __init__(self,Name,WorkDetail):
self._Name = Name
self._WorkDetail = WorkDetail
self._SubDepartMent=[]
def Add(self,ObjDepartMent):
self._SubDepartMent.append(ObjDepartMent)
def Del(self,ObjDepartMent):
self._SubDepartMent.remove(ObjDepartMent)
def Work(self):
print self._Name+'work:'+self._WorkDetail
for DepartMent in self._SubDepartMent:
DepartMent.Work()
ZTE = DepartMent('中兴通讯','生产通讯设备')
SmartPhoneDept =IndependentDepartment('--手机事业部','生产手机')
WireLess = DepartMent('--无线院','研发无线产品')
ZTE.Add(SmartPhoneDept)
ZTE.Add(WireLess)
UMTSTestingDept=IndependentDepartment('----UMTS基站测试部','基站测试')
UMTSSoftDept=IndependentDepartment('----UMTS基站软件部','基站软件开发')
WireLess.Add(UMTSTestingDept)
WireLess.Add(UMTSSoftDept)
程序执行效果: