意图: 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
适用性: 你想表示对象的部分-整体层次结构。你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。
典型的 Composite 对象结构如下图表示:
"""
应用组合模式的会员卡消费
那么我们就根据我们会员卡的消费,来模拟一下组合模式的实现吧。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()