Skip to content

设计模式之责任链模式

如果一件事情对你很重要,即使成功的概率很小,你也应该去做。

Author:李东阳

1、什么是责任链模式

内容

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。

角色

  • 抽象处理者(Handler)

  • 具体处理者(Concrete Handler)

  • 客户端(Client)

2、责任链模式的实现

这个责任链的意思是说,有这么几个对象,它们之间有等级关系。同时,它们都能够处理同一种请求。但是,它们处理这个请求是根据这个等级来划分的。以这个等级来形成一种链,请求一到达,会去找等级最低的处理者,如果这个请求够高,那么处理这个请求的处理者的等级也会相应的提高。

举个例子: 就拿公司员工请假来说,一个员工请假,最先肯定是去找项目主管。当主管决定不了时,就交给部门经理,当部门经理也决定不了时,那么就到了公司的最高层总经理这里。

下面是代码实现:

from abc import ABCMeta, abstractmethod


# 抽象处理者
class Handler(metaclass=ABCMeta):
    @abstractmethod
    def handle_leave(self, day):
        pass


# 具体处理者
class GeneralManager(Handler):
    def handle_leave(self, day):
        if day <= 10:
            print("总经理准假{}天。".format(day))
        else:
            print('你还是滚蛋吧!')  # 关系链最顶端


# 具体处理者
class DepartManager(Handler):
    def handle_leave(self, day):
        if day <= 5:
            print('部门经理准假{}。'.format(day))
        else:
            print('部门经理决定不了')
            return GeneralManager().handle_leave(day)  # 交给上以一级处理


# 具体处理者
class ProjectManager(Handler):
    def handle_leave(self, day):
        if day <= 1:
            print('项目主管准假{}。'.format(day))
        else:
            print('项目主管决定不了')
            return DepartManager().handle_leave(day)  # 交给上一级处理


# 客户端
day = 9
ProjectManager().handle_leave(day)  # 从最低级开始请假

# 输出
# 项目主管决定不了
# 部门经理决定不了
# 总经理准假9天。

3、总结

优点

降低了请求发出者和请求处理者之间的耦合。增强了对象指派职责的灵活性。

缺点:

一方面责任链过长会出现性能问题,另一方面,如果一个情求没有被正确处理也就是说不存在一个可以处理该请求的命令接收者而反复执行。