大话设计模式Python实现-组合模式

组合模式(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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

posted @ 2017-11-20 15:14  Andy冉明  阅读(2498)  评论(0编辑  收藏  举报