意图: 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

适用性: 你想表示对象的部分-整体层次结构。你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。

典型的 Composite 对象结构如下图表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
"""
应用组合模式的会员卡消费
那么我们就根据我们会员卡的消费,来模拟一下组合模式的实现吧。Let's go!
首先:
1. 我们的部件有,总店,分店,加盟店。
2. 我们的部件共有的行为是:刷会员卡
3. 部件之间的层次关系,也就是店面的层次关系是,总店下有分店、分店下可以拥有加盟店。
有了我们这几个必要条件后,我的要求就是目前店面搞活动当我在总店刷卡后,就可以累积相当于在所有下级店面刷卡的积分总额,设计的代码如下:
"""


class Store(object):
"""店面基类"""

"""添加店面"""

def add(self, store):
pass

"""删除店面"""

def remove(self, store):
pass

"""消费"""

def pay_by_card(self):
pass


class BranchStore(Store):
def __init__(self, name):
self.name = name
self.my_store_list = []

def pay_by_card(self):
print("店面[%s]的积分已累加进该会员卡" % self.name)
for s in self.my_store_list:
s.pay_by_card()

# 添加店面
def add(self, store):
self.my_store_list.append(store)

# 删除店面
def remove(self, store):
self.my_store_list.remove(store)


class JoinStore(Store):
def __init__(self, name):
self.name = name

def pay_by_card(self):
print("店面[%s]的积分已累加进该会员卡" % self.name)

def add(self, store):
print("无添加子店权限")

def remove(self, store):
print("无删除子店权限")


if __name__ == '__main__':
store = BranchStore("朝阳总店")
branch = BranchStore("海滨分店")
store.add(branch)
store.pay_by_card()