行为型设计模式-责任链(chain of responsibility)模式-python实现

设计模式汇总:查看

通俗示例

想象一下你在一个客服中心工作,当一个客户的问题提交给客服中心时,这个问题可能会被第一个可用的客服人员处理。如果这位客服人员无法解决问题,那么问题会被转发给更高级别的客服。这个过程可能会一直持续到问题被解决或者达到最高级别的支持。这种处理问题的方式就是一个责任链的例子。

通俗解释

责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在责任链模式中,多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它或者请求到达链的末端。

责任链模式的组成包括:

  • 处理者(Handler):定义处理请求的接口,通常还包含一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler):处理它所负责的请求,如果无法处理,则将请求传递给链中的下一个处理者。

责任链模式的优点

  • 降低耦合度:请求的发送者和接收者之间无需知道对方的详细信息。
  • 增加灵活性:可以动态地添加或者删除处理者,无需修改现有代码。
  • 增强可扩展性:可以很容易地扩展新的处理者类。

Python代码示例

以下是一个责任链模式的简单实现:

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 LineManager(Manager):
    """直属经理"""
    def handleRequest(self, request):
        if request.requestType == 'DaysOff' and request.number <= 3:
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
        else:
            print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                return self.successor.handleRequest(request)


class DepartmentManager(Manager):
    """部门经理"""
    def handleRequest(self, request):
        if request.requestType == 'DaysOff' and request.number <= 7:
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
        else:
            print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                return 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)


class Request:
    """
    请求类,用于封装请求信息和处理请求。

    Attributes:
        requestType: 请求的类型。
        requestContent: 请求的内容。
        number: 请求的编号,默认为0。
    """

    def __init__(self, requestType, requestContent, number=0):
        """
        初始化请求对象。

        Args:
            requestType: 请求的类型。
            requestContent: 请求的内容。
            number: 请求的编号,默认为0。
        """
        self.requestType = requestType
        self.requestContent = requestContent
        self.number = number

    def commit(self, generalManager):
        """
        提交请求,由请求者调用,将请求交给管理者处理。

        Args:
            generalManager: 管理者对象,用于处理请求。

        Returns:
            处理请求后的返回值。
        """
        ret = generalManager.handleRequest(self)
        print(ret)
        return ret


# 当模块作为主程序运行时,以下代码块将被执行
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)

总结

责任链模式通过将请求的发送者和接收者解耦,允许动态地构建处理者链,使得请求可以在多个对象之间传递,直到被处理。这种方式特别适用于那些需要多个对象共同处理一个请求的场景,比如异常处理、工作流处理等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值