菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
224
0

责任链模式

原创
05/13 14:22
阅读数 91282

1、责任链模式

1.1、先抛出问题

现在我们有一个业务要求如下:

- 判断此请求是否合法,不合法则拦截
- 判断此请求是否为接受请求,不是则丢弃
- 判断此请求用户是否登录,未登录则先登录
- 判断此请求用户是否授权此请求,未授权则异常返回
- 扒拉扒拉扒拉还有一大堆...................

此时我们过滤拦截代码会很繁杂,而且对于判断顺序也是繁杂,如果出现不同请求不同判断逻辑,那又得加if,然后当后面出现新需求,那又得扒拉扒拉的堆积代码。这种情况是不好的,我们只要抽出时间细想这些代码,就应该知道,我们应该将这种业务规范起来,使其井井有序,而不是胡乱堆积代码(代码堆积起来的坏处就不说,理不清是其次,出错了找问题很头大)。

那么这个时候责任链模式就派上了用场,这个模式很适合处理这种场景。

1.2、对抛出问题的解决

我们先不说责任链模式是啥,我们先对上面的问题处理一下,看图:

现在看到的图就是我们抛出的问题的情况,我们用户请求来后,需要做这一大堆的业务逻辑,如果用if判断的话,那当不同种类请求进行不同逻辑判断的话,就会造成繁杂的问题,这里我们将每个业务逻辑单独抽取到一个类中,作为一个业务逻辑处理单元。再看图:

我们请求来后,先通过业务逻辑执行器,再由业务逻辑执行器去生成业务逻辑执行链,业务逻辑执行链由多个业务逻辑处理单元组成,他们就跟链表一样,按照我们执行的顺序连接下去。如下图:

这个时候我们可以得出结论,当用户请求来时,我们Execution根据请求类型决定业务逻辑处理单元有哪些,顺序是什么样的,然后在去执行第一个业务逻辑处理单元,然后就会像链条一样处理下去,如果中途有失败的,那么就直接返回了。当然这里的handler方法的返回值可以自定义,不一定要boolean,而且处理逻辑单元的参数,业务逻辑执行器的方法都可以自定义,只要保证业务逻辑处理单元是链条一样,然后业务逻辑执行器可以生成一条业务逻辑处理链,那么就可以了。

这种设计模式对于处理大量业务逻辑的场景很适用,本随笔也只是讲述这么一个方法,具体实现可自行评估。

附网上搜寻的示例代码:

https://files.cnblogs.com/files/daihang2366/chain.rar

发表评论

0/200
224 点赞
0 评论
收藏
为你推荐 换一批