java 责任链模式 链表_责任链模式的实现及源码中应用

01

责任链模式的实现

假设一个出差任务的流程需要审批出差行程和出差报销金额。那么,对应两个部门的审核。我们先定义一个出差任务Task类:

57bc42b5a69c5b43f59f92b3562dc95e.png

然后,我们定义一个抽象的处理类Handler,其中具体的处理方法Handle交给子类去实现。

a9f854e6f7cce1008313b20823c91262.png

然后,出差行程的审核者继承了Handler,并实现了其中的Handle方法。其中,处理成功,需要判断是否有下一个Handler,如果有则传递下去。

fba12ee97b9ee9a984aaaf30d6c24934.png

然后继续实现出差金额的审核者MoneyHandler,其处理思路和上面类似。

c37c6e12a8f9e8ebdda8289e2209a747.png

测试类如下,首先创建出差任务。然后在应用层设置处理流程(即有哪几个Handler),然后从第一个流程开始启动。

75e61df7d8004f8c2f3d13e71c61f24f.png

测试结果如下,从测试结果可以看出,正常处理。如果某一个审核不通过,则会终止当前的Handler向下传播。

5b3cfbefb06a22a4c26f45f3b70a3a5d.png

02

Netty中的源码

在Netty中的Pipeline上是基于链表实现的责任链。在Pipeline上添加Handler,最终Handler会在责任链上传递。

f5e08976e45dc039dbbd05b10a84979f.png

13596f7d628b6669e3eaf211fe04d074.png

具体可以参考Netty中的源码。

此外,在Servlet中的Filter也是基于责任链模式实现的,与上面的案例实现方式一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到其一个处理者对其进行处理。在 Python ,可以使用类似于链表的方式来实现责任链模式。 具体来说,可以定义一个抽象处理者类,其包含一个指向下一个处理者的引用。每个具体处理者类都实现了处理请求的方法,并在必要时将请求传递给下一个处理者。当请求到达最后一个处理者时,如果没有任何处理者能够处理该请求,则该请求将被忽略。 以下是一个简单的 Python 责任链模式示例: ```python class Handler: def __init__(self, successor=None): self._successor = successor def handle(self, request): handled = self._handle(request) if not handled: self._successor.handle(request) def _handle(self, request): raise NotImplementedError('Must provide implementation in subclass.') class ConcreteHandler1(Handler): def _handle(self, request): if 0 < request <= 10: print(f'Request {request} handled in handler 1') return True class ConcreteHandler2(Handler): def _handle(self, request): if 10 < request <= 20: print(f'Request {request} handled in handler 2') return True class ConcreteHandler3(Handler): def _handle(self, request): if 20 < request <= 30: print(f'Request {request} handled in handler 3') return True if __name__ == '__main__': h1 = ConcreteHandler1() h2 = ConcreteHandler2(h1) h3 = ConcreteHandler3(h2) requests = [2, 5, 14, 22, 18, 3, 35, 27, 20] for request in requests: h3.handle(request) ``` 在上面的示例,我们定义了一个抽象处理者类 `Handler`,其包含一个指向下一个处理者的引用 `_successor` 和一个处理请求的方法 `handle`。每个具体处理者类都实现了 `_handle` 方法来处理请求,并在必要时将请求传递给下一个处理者。 在 `main` 函数,我们创建了三个具体处理者对象 `h1`、`h2` 和 `h3`,并将它们链接在一起。然后,我们创建了一些请求,并将它们依次传递给 `h3` 处理者。由于每个处理者只能处理特定范围内的请求,因此只有符合条件的请求才会被处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值