其他分享
首页 > 其他分享> > 学以致用01|流程设计之功能链模式

学以致用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);

总结

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

标签:01,职责,对象,检测,流程,模式,请求,学以致用
来源: https://blog.csdn.net/qq_40836123/article/details/112127319