设计模式之责任链模式

责任链模式属于:行为型设计模式,所谓行为设计模式即处理系统实体之间通信的设计模式。
责任链模式 – 用于让多个对象处理一个请求时,或者用于预先不知道由哪个对象来处理某种特定请求时,其原则如下:
1、存在一个对象链(链表、树或者其他便捷的数据结构)。
2、一开始将请求发送给第一个对象,让其处理。
3、对象决定是否处理该请求。
4、对象将请求转发给下一个对象。
5、重复该过程,直到达到链尾。
需求
  假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了;如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准;如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准。类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if…else…,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来。简单分析下需求,“假条”在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条“链”把他们进行有序连接。
代码示例:

class Manager():
    """经理类"""
    successor = None
    name = ''

    def __init__(self, name):
        self.name = name

    def setSuccessor(self, successor):
        self.successor = successor

    def handleRequest(self, request):
        pass


class Request():
    def __init__(self, requestType, requestContent, number=0):
        self.requestType = requestType
        self.requestContent = requestContent
        self.number = number

    def commit(self, generalManager):
        ret = generalManager.handleRequest(self)
        print(ret)
        return ret


class LineManager(Manager):
    """直属经理"""

    def handleRequest(self, request):
        if request.requestType == "DaysOff" and request.number <= 3:
            print('%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number))
        else:
            print("%s:%s Num:%d Accept CONTINE" % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                self.successor.handleRequest(request)


class DepartmentManager(Manager):
    """部门经理"""

    def handleRequest(self, request):
        if request.requestType == "DaysOff" and request.number <= 7:
            print('%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number))
        else:
            print("%s:%s Num:%d Accept CONTINE" % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                self.successor.handleRequest(request)


class GeneralManager(Manager):
    """总经理"""

    def handleRequest(self, request):
        if request.requestType == "DaysOff":
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)


if __name__ == '__main__':
    line_manager = LineManager('LINE MANAGER')
    department_manager = DepartmentManager('DEPARTMENT MANAGER')
    general_manager = GeneralManager('GENERAL MANAGER')
    line_manager.setSuccessor(department_manager)
    department_manager.setSuccessor(general_manager)
    request = Request(requestContent="'Ask 1 day off'", requestType='DaysOff', number=1)
    request.commit(line_manager)
    request = Request(requestContent="'Ask 5 day off'", requestType='DaysOff', number=5)
    request.commit(line_manager)
    request = Request(requestContent="'Ask 10 day off'", requestType='DaysOff', number=10)
    request.commit(line_manager)

输出结果如下:

LINE MANAGER:'Ask 1 day off' Num:1 Accepted OVER
DEPARTMENT MANAGER:'Ask 1 day off' Num:1 Accepted OVER
None
LINE MANAGER:'Ask 5 day off' Num:5 Accept CONTINE
DEPARTMENT MANAGER:'Ask 5 day off' Num:5 Accepted OVER
None
LINE MANAGER:'Ask 10 day off' Num:10 Accept CONTINE
DEPARTMENT MANAGER:'Ask 10 day off' Num:10 Accept CONTINE
None

文章仅为学习记录使用,如有侵权,告知删除

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值