python 设计模式(十二) 组合模式(composite pattern)

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

举例如下:学校里的教员包括校长,也包括年级主任,也包括普通的学科老师。校长管理年级主任和普通老师,普通老师又被年级主任管理者。下面实现了staff抽象类,teacher(教员)和director(校长和年级主任)都继承自staff抽象类。具体实现如下:

import abc


class Staff(object):
    """
    抽象类
    """
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def add_people(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def remove_people(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def work(self, *args, **kwargs):
        pass


class Teacher(Staff):
    def __init__(self, name):
        self.name = name

    def add_people(self):
        print('I am a regular teacher, no man at my hand')

    def remove_people(self):
        print('no man at my hand')

    def work(self):
        print('regular teacher %s start working' % self.name)


class Director(Staff):
    def __init__(self, name):
        self.name = name
        self.members = []

    def add_people(self, teacher):
        self.members.append(teacher)

    def remove_people(self, teacher):
        self.members.remove(teacher)

    def work(self):
        print('director %s start working' % self.name)
        for member in self.members:
            member.work()


class Client(object):
    def __init__(self, teacher):
        self.teacher = teacher

    def work(self):
        self.teacher.work()

if __name__ == '__main__':
    director = Director('laoguo')
    director1 = Director('laoliu')
    teacher1 = Teacher('laoxie')
    teacher2 = Teacher('laoding')
    director1.add_people(teacher1)
    director1.add_people(teacher2)
    director.add_people(director1)
    client = Client(director)
    client.work()
    print('*'*100)
    client.teacher = director1
    client.work()
    print('*'*100)
    client.teacher = teacher1
    client.work()

结果如下:

director laoguo start working
director laoliu start working
regular teacher laoxie start working
regular teacher laoding start working
****************************************************************************************************
director laoliu start working
regular teacher laoxie start working
regular teacher laoding start working
****************************************************************************************************
regular teacher laoxie start working

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值