组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.
下面是一个组合模式的demo:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 6 """ 7 大话设计模式 8 设计模式——组合模式 9 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 10 """ 11 12 # 抽象一个组织类 13 class Component(object): 14 15 def __init__(self, name): 16 self.name = name 17 18 def add(self,comp): 19 pass 20 21 def remove(self,comp): 22 pass 23 24 def display(self, depth): 25 pass 26 27 # 叶子节点 28 class Leaf(Component): 29 30 def add(self,comp): 31 print '不能添加下级节点' 32 33 def remove(self,comp): 34 print '不能删除下级节点' 35 36 def display(self, depth): 37 strtemp = '' 38 for i in range(depth): 39 strtemp += strtemp+'-' 40 print strtemp+self.name 41 42 43 # 枝节点 44 class Composite(Component): 45 46 def __init__(self, name): 47 self.name = name 48 self.children = [] 49 50 def add(self,comp): 51 self.children.append(comp) 52 53 def remove(self,comp): 54 self.children.remove(comp) 55 56 def display(self, depth): 57 strtemp = '' 58 for i in range(depth): 59 strtemp += strtemp+'-' 60 print strtemp+self.name 61 for comp in self.children: 62 comp.display(depth+2) 63 64 if __name__ == "__main__": 65 #生成树根 66 root = Composite("root") 67 #根上长出2个叶子 68 root.add(Leaf('leaf A')) 69 root.add(Leaf('leaf B')) 70 71 #根上长出树枝Composite X 72 comp = Composite("Composite X") 73 comp.add(Leaf('leaf XA')) 74 comp.add(Leaf('leaf XB')) 75 root.add(comp) 76 77 #根上长出树枝Composite X 78 comp2 = Composite("Composite XY") 79 #Composite X长出2个叶子 80 comp2.add(Leaf('leaf XYA')) 81 comp2.add(Leaf('leaf XYB')) 82 root.add(comp2) 83 # 根上又长出2个叶子,C和D,D没张昊,掉了 84 root.add(Leaf('Leaf C')) 85 leaf = Leaf("Leaf D") 86 root.add(leaf) 87 root.remove(leaf) 88 #展示组织 89 root.display(1)
上面类的设计如下图:
应用场景:
在需要体现部分与整体层次的结构时
希望用户忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。