文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么干掉if else

2024-04-02 19:55

关注

这篇文章主要介绍“怎么干掉if else”,在日常操作中,相信很多人在怎么干掉if else问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么干掉if else”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

责任链通用实现

现在我就默认大家都知道什么是责任链模式了,如果还对这个不懂的同学,可以先看看我之前的文章。

怎么干掉if else

首先,我们会有一个业务执行器接口,所有的业务实现都会实现该接口,这意味着上图的逻辑A、B、C都会实现这个接口

 public interface BusinessProcess {     void process(ProcessContext context); }

可以看到的是接口异常的简单,只有一个process处理的方法,方法接收的是ProcessContext

为什么process方法需要接收ProcessContext?很简单,我们在处理逻辑A、B、C的时候,可能逻辑B需要依赖逻辑A的处理结果。于是我们就需要有一个载体把这些给记录下来。

所以,我们就有了ProcessContext,它代表的是责任链的上下文。

 public class ProcessContext {     // 标识责任链的code     private String code;     // 存储上下文的真正载体     private Model model;     // 责任链中断的标识     private Boolean needBreak = false; }

现在责任链的执行器和责任链所涉及的上下文都已经有了,这意味着我们已经有了责任链最主要的抽象了。

接下来就是我们需要把链给串起来,于是我们需要一个模板,其实我们做的就是用一个List来把BusinessProcess的子类给串起来。

 public class ProcessTemplate {     private List<BusinessProcess> processList;     public List<BusinessProcess> getProcessList() {         return processList;     }     public void setProcessList(List<BusinessProcess> processList) {         this.processList = processList;     } }

OK,现在我们已经把责任链的整块给抽象好了,接下来就是暴露流程控制器去执行这个责任链:

 @Data public class ProcessController {          // 不同的code 对应不同的责任链     private Map<String, ProcessTemplate> templateConfig = null;      public void process(ProcessContext context) {         //根据上下文的Code 执行不同的责任链         String businessCode = context.getCode();         ProcessTemplate processTemplate = templateConfig.get(businessCode);         List<BusinessProcess> actionList = processTemplate.getProcessList();         //遍历某个责任链的流程节点         for (BusinessProcess action : actionList) {             try {                 action.process(context);                 if (context.getNeedBreak()) {                     break;                 }             } catch (Exception e2) {                 //...             }         }     } }

我们可以看到的是在ProcessController执行链通用的流程控制器上会有一个Map去存储多个责任链的模板,这样做的好处就是:ProcessController这个流程控制器可以根据code支持多个责任链执行。

接下来就是我们有具体的BusinessProcess去加入到ProcessTemplate的链上,然后调用ProcessController的方法去执行整一条推送链。

一般我们在XML注入就好了,比如说现在我们有两个BusinessProcess的实现,分别是白名单和发消息的逻辑:

 @Service public class WhiteListProcess implements BusinessProcess {     @Override     public void process(ProcessContext context) {         UserModel user = (UserModel) context.getModel();         if ("3y".equals(user.getName())) {             context.setNeedBreak(true);         }     } }   @Service public class SendMessageProcess implements BusinessProcess {      @Override     public void process(ProcessContext context) {         UserModel user = (UserModel) context.getModel();         System.out.println("给"+user.getName()+"发消息");     } }

然后我们把上面两个处理器添加到ProcessTemplate的模板上,把ProcessTemplate添加到ProcessController的Map上:

<!--发送消息的责任链--> <bean id="sendMessageTemplate" class="com.chainofresponsibility.ProcessTemplate">   <property name="processList">     <list>       <ref bean="whiteListProcess"></ref>       <ref bean="sendMessageProcess"></ref>     </list>   </property> </bean>  <!--通用流程处理器,维护多条责任链--> <bean id="processController" class="com.chainofresponsibility.ProcessController">   <property name="templateConfig">     <map>       <entry key="sendMessage" value-ref="sendMessageTemplate" />     </map>   </property> </bean>

然后我们在接口里边执行这个责任链:

@RestController public class UserController {     @Autowired     private ProcessController processController;      @RequestMapping("/send")     public void  send(String userName) {         // 构建上下文         ProcessContext processContext = new ProcessContext();          UserModel userModel = new UserModel();         userModel.setAge("24");         userModel.setName(userName);         processContext.setModel(userModel);          processContext.setCode("sendMessage");          processController.process(processContext);     } }

我做了这么大的一套东西实现了什么功能?其实就一个if逻辑:

if ("3y".equals(userModel.getName())) {   return; } System.out.println("给" + userModel.getName() + "发消息");

下面我们还是来看看效果,从功能上我们可以发现,只要我们输入的不是「3y」,那就会打印消息

怎么干掉if else

上面的逻辑,实际上就是一套通用的责任链的代码,最核心的其实就是四个角色:「业务抽象接口」、「执行过程中的上下文」、「将业务实现类串起来」和「一个通用的控制器执行责任链」

怎么干掉if else

如果没看懂的同学,三歪建议再对比一下代码看看,责任链这种设计模式是非常好用,在项目里边也是非常常见的。

只要把BusinessProcess/ProcessContext/ProcessTemplate/ProcessController的代码给拷过去自己的项目中,这就能帮你把原有的if  else逻辑给干掉。

Pipeline

不知道大家看过Pipeline这个词了没,在学Redis的时候可能会见过,在Redis里边我们会用Pipeline去做批量的操作。

抛开Redis的Pipeline,但从宏观的角度上来,Pipeline其实是一种架构思想。

同时我也认为它是「责任链模式」的实现之一。

下面来看看我这边的一个Pipeline实现的架构图:

怎么干掉if else

到此,关于“怎么干掉if else”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯