学以致用01|流程设计之功能链模式

最近在学习设计模式,当我学到职责链模式时,突然想到我之前做过的一个课程设计——智能安检APP。
首先大致介绍下该App的业务流程:

智能安检APP的业务流程

  • 第一步检测人脸上是否佩戴了口罩,检测成功执行第二步,否则重复第一步
  • 第二步检测出示的健康码的颜色,检测成功执行第三步,否则重复第一步
  • 第三步检测出示的健康码的时间,检测成功一轮检测结束,否则重复第一步

它实现了自动检测人脸是否佩戴口罩,检测健康码的功能。由于当时做课设时时间紧迫,实现功能的时候完全没考虑代码的解耦,所有功能实现都挤在一个类实现。现在当我想要新增功能时,看得我是一脸愁容啊。

APP设计存在问题

  1. 比如当我想要新增体温检测流程时,要改的地方太多了,甚至无从下手
  2. 代码写的杂乱,牵一发动全身

所以在我学到职责链模式时,突然灵机一动,这个检测流程不就可以用这种模式来优化嘛!
首先带大家简单回顾下什么是职责链模式:

职责链模式定义

(来自《研磨设计模式》)

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

注意职责链模式的定义,它是如果有一个对象处理了就停止传递,而我的需求是每一个对象都处理请求,直到最后一个对象处理完为之。
所以更准确的来说,这是职责链模式的变形——功能链模式
什么是功能链模式:

功能链模式定义

每个职责对象负责处理请求的某一方面的功能,处理完成后,不是停止,而是继续向下传递请求,当请求通过很多职责对象处理后,功能也就完成了,把这样的职责链称为功能链。

那么套用到app检测流程上就是:有一个处理检测口罩的对象,有一个处理检测健康码颜色的对象,有一个处理检测健康码时间的对象,把这三个对象连成一条链,然后客户端发起一个请求,由这条链来处理请求。

重构代码

在确定了我采用功能链模式之后,我就开始重新设计类的结构了。首先看下标准职责链模式的类结构:
职责链模式的结构
在功能链模式下:
Handler类是一个抽象类,定义处理请求的方法,同时也持有一个Handler对象,即为后继的职责对象。
ConcreteHandler类继承Handler类,实现具体处理请求的方法。其handleRequest()方法会处理请求,该方法最后会判断自己的后继职责对象是否为空,如果不为空,就调用后继职责对象的hanleRequest()方法,将请求传递下去。
重新设计类结构后,我将原来糅合在一个客户端类中的流程分离出来,类结构如下所示:
在这里插入图片描述
可以看到我的抽象类结构中比标准模式多了一些字段,以及方法中多了HandleData类型的参数。因为在我的业务流程中,每一轮检测,每个检测流程不可能只检测一次。比如健康码检测过程中,被测人员在打开健康码的时候慢了一拍,没捕捉到,就直接断定检测流程失败,重新口罩的检测,这会浪费大量的时间。所以我需要检测流程对象去持有一些状态数据,来表明当前这个流程测了几次,最多检测几次。
同时传入了HandleData对象,方便传入检测流程中需要的数据,以及存储检测的结果。
最后在客户端中只需以下代码,就能完成流程检测:

		//初始化各个流程
        ModuleHandle maskHandle=new MaskModuleHandle(3);
        ModuleHandle codeTimeHandle=new CodeModuleHandle(3);
        ModuleHandle codeColorHandle=new CodeColorModuleHandle(3);
        //定义流程先后关系
        maskHandle.setNextModule(codeColorHandle);
        codeColorHandle.setNextModule(codeTimeHandle);
        //开始一轮检测
        maskHandle.handle(handleData);

总结

设计模式博大精深,是软件开发的经验总结,很多流行的框架中都有其身影,值得我们认真学习。我使用其中的职责链模式,就很好的解决了之前代码杂乱,耦合高的问题。我希望在以后的学习中,能将理论与实际相结合,将学到的知识应用于待解决的问题中,做到学以致用,这才是我们学习真正的目的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值