#-*- coding:gbk -*-
#-*- coding:utf-8 -*-
"""
这是组合模式的一个应用场景。
阿涛游历江湖,遇到伏火教的人,向知情人打探消息后决定记录其组织结构的数据,以便以后
分析。
由于对伏火教的情报掌握有限,因此阿涛决定先忽略总教和分教的区别,于是采用了组合模式
进行记录。
note:
1.当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象和单个
对象的不同,统一地使用组合结构的所有对象时,就应该考虑用组合模式了。
"""
from abc import ABCMeta, abstractmethod
#江湖帮派的抽象类
class jiangHuBangPai(object):
__metaclass__ = ABCMeta
def __init__(self):
self.children = None
self.name = None
#帮派设立新分派或新分堂
@abstractmethod
def addBranch(self):
pass
#帮派关闭分派或新分堂,比如分堂被捣毁时就调用这个方法
@abstractmethod
def delBranch(self):
pass
def display(self):
print(self.name)
if self.children != None:
print('%s的分支:' % self.name)
for child in self.children:
child.display()
print('%s的分支结束' % self.name)
#伏火教总教、分教据点,可以设立或取消其他据点
class fuHuoJiao(jiangHuBangPai):
def __init__(self, name):
self.name = name
self.children = []
def addBranch(self, fuHuoNode):
for child in self.children:
if child.name == fuHuoNode.name:
print("已有此据点")
return
self.children.append(fuHuoNode)
def delBranch(self, name):
for child in self.children:
if name == child.name:
self.children.remove(child)
return
print("没有这个据点")
#伏火教分堂据点,分堂不能设立或取消其他据点
class fuHuoJiaoFenTang(jiangHuBangPai):
def __init__(self, name):
self.name = name
self.children = None
def addBranch(self):
print("分堂不能设立据点")
def delBranch(self):
print("分堂不能取消据点")
#Client
if __name__ == '__main__':
fuHuoZongJiao = fuHuoJiao("总教")
fuHuoFenJiaoA = fuHuoJiao("分教A")
fuHuoFenJiaoB = fuHuoJiao("分教B")
fuHuoZongJiao.addBranch(fuHuoFenJiaoA)
fuHuoZongJiao.addBranch(fuHuoFenJiaoB)
fuHuoQingLongTang = fuHuoJiaoFenTang('青龙堂')
fuHuoZhuQueTang = fuHuoJiaoFenTang('朱雀堂')
fuHuoFenJiaoA.addBranch(fuHuoQingLongTang)
fuHuoFenJiaoB.addBranch(fuHuoZhuQueTang)
fuHuoZongJiao.display()
设计模式之组合模式
最新推荐文章于 2014-10-05 21:21:05 发布