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

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

photo_2019-11-25_20-30-39

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

photo_2019-11-25_20-32-29

"""
应用组合模式的会员卡消费
    那么我们就根据我们会员卡的消费,来模拟一下组合模式的实现吧。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()