1. 策略模式解决if - else 的代码

业务场景:

外包企业的审批人需要审批打卡的场景;

审批人分为多种不同的级别,多种级别中具有方式相同但是内容不同的操作:审批。

原来场景:

有前端传来审批人参数,使用if-else 来判断该审批人的级别属于哪一个级别,执行相应的审批方法。每一个审批方法写在了业务类底,命名采用1级审批,2级审批---等等的命名方式来命名。

问题:if - else 逻辑复杂,不易阅读,函数中审批能抽象的地方未抽象,

两个核心问题:test测试非常麻烦,新增审批人员需要对代码进行修改,违背开闭原则。

解决过程:

  1. 抽象审批中的原子操作的代码,比如查询对应级别所审批的同学名单。代码变得好看一些,但是任然未解决,if - else 和 多个 审批方法的实现。

  2. 尝试策略模式

    1. 使用策略模式将每个级别的用户抽象起来

    2. package strategy;
      
      public class Main {
      public static void main(String[] args) {
      if (LevelEnum.LEVEL1.equals(1)) {
      SupervisorControl supervisorControl = new SupervisorControl(new Supervisor1());
      supervisorControl.execute(1);
      }
      if (LevelEnum.LEVEL2.equals(2)) {
      SupervisorControl supervisorControl = new SupervisorControl(new Supervisor2());
      supervisorControl.execute(2);
      }
      if (LevelEnum.LEVEL3.equals(3)) {
      SupervisorControl supervisorControl = new SupervisorControl(new Supervisor3());
      supervisorControl.execute(3);
      }
      }
      }
      package strategy;
      
      public enum LevelEnum {
      LEVEL1, LEVEL2, LEVEL3
      }
      package strategy;
      
      public interface Supervisor {
      void examine(int supervisorId);
      }
      package strategy;
      
      public class Supervisor1 implements Supervisor {
      public void examine(int supervisorId) {
      System.out.println("去做一些和1级supervisor相关的工作");
      }
      }
      package strategy;
      
      public class Supervisor2 implements Supervisor {
      public void examine(int supervisorId) {
      System.out.println("去做一些和2级supervisor相关的工作");
      }
      }
      package strategy;
      
      public class Supervisor3 implements Supervisor {
      public void examine(int supervisorId) {
      System.out.println("去做一些和3级supervisor相关的工作");
      }
      }
      package strategy;
      
      public class SupervisorControl {
      Supervisor supervisor;
      public SupervisorControl(Supervisor supervisor) {
      this.supervisor = supervisor;
      }
      public void execute(int id) {
      supervisor.examine(id);
      }
      }

解决方法:

  1. 混合使用策略模式和反射来解决
package strategy;

public class Main {
public static void main(String[] args) {
// if (LevelEnum.LEVEL1.equals(1)) {
// SupervisorControl supervisorControl = new SupervisorControl(new Supervisor1());
// supervisorControl.execute(1);
// }
// if (LevelEnum.LEVEL2.equals(2)) {
// SupervisorControl supervisorControl = new SupervisorControl(new Supervisor2());
// supervisorControl.execute(2);
// }
// if (LevelEnum.LEVEL3.equals(3)) {
// SupervisorControl supervisorControl = new SupervisorControl(new Supervisor3());
// supervisorControl.execute(3);
// }
String packageName = Supervisor1.class.getPackage().getName();
String supervisorName = packageName + "." + "Supervisor" + "2";
try {
Class<?> clazz = Class.forName(supervisorName);
Supervisor supervisor = (Supervisor) clazz.newInstance();
supervisor.examine(1);
} catch (Exception e) {
System.out.println(e);
} }
}

注意

class.forName() 需要传入的格式是"包名.类名"。如果找不到包名则会报ClassNotFoundException

可以通过class.getPackage来获取包名。


到此我们解决了if - else 很多的问题,并且解决了需要侵入代码修改的问题,如果新增supervisor的级别,只需要和前端达成一致,后台继续写一个supervisor4对象即可。

为什么解决了test难的问题

对于test来说,每一个If-else 都需要我们去验证,这其实就是两个test, if 一个 else一个,如果有很多if - else,想要保证高的test覆盖率,就会非常头痛。

然而我们用策略模式 和 反射来解决,只需要,对主逻辑一个test,每一个实现方法做一个test即可。

至此,所有问题都解决了,代码一片光明。

过多if - else 的问题, 以及策略模式 + 反射解决方法的更多相关文章

  1. Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

    同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源 ...

  2. 对于使用progisp软件进行ISP编程时进入不了编程模式的解决方法

    标题: 对于使用progisp软件进行ISP编程时无法进入编程模式的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [progisp, 软件] 目录: 软件 日期: 2019- ...

  3. AWS AutoScaling的一个ScaleDown策略问题以及解决方法

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. AWS AutoScaling简介 AutoScaling是AWS的一个重要服务,用来弹性的自动创建(S ...

  4. 策略模式&反射

    业务代码 class Operate { public string _firstKey; public string _secondKey; public string _extendKey; pu ...

  5. chrome进入控制台时自动进入断点模式的解决方法

    简单粗暴,不知道为什么,去掉那个√就好了

  6. 高并发连接导致打开文件过多:java.io.IOException: Too many open files 解决方法

    用 CentOS 做 API 接口服务器供其他终端调用时,并发量高会报错:java.io.IOException: Too many open files. 其原因是在 Linux 下默认的Socke ...

  7. chrome打开控制台状态下,没有人为打断点,自动进入断点模式的解决方法

    如下图所示:在控制台去掉Sources -> XHR/fetch Breakpoints -> Any XHR or fetch 的勾

  8. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开 ...

  9. 【策略模式】策略模式结合Spring实战Demo

    策略模式 策略模式用于解决判断分支过多的问题,使代码变得简洁和优雅, 策略模式在多种方式在项目中落地,下面举例说明通过指定不同类型的订单使用策略模式执行不同的业务逻辑 文章参考自公众号:石杉的架构笔记 ...

随机推荐

  1. 什么样的 SQL 不走索引

    参考: MySQL 索引优化全攻略 索引建立的规则 1.能创建唯一索引就创建唯一索引 2.为经常需要排序.分组和联合操作的字段建立索引 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条 ...

  2. python 表达式

    运算符 参考 https://www.runoob.com/python3/python3-basic-operators.html & https://www.runoob.com/pyth ...

  3. select函数详细用法解析

    1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...

  4. Ubuntu第一次使用注意点

    第一次装完Ubuntu登录,打开命令行,登录的不是root权限,切换root不成功: 这个问题产生的原因是由于Ubuntu系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在 ...

  5. MOOC学习成果认证及对高等教育变革路径的影响

    MOOC是网络开放教育创新发展的产物,也是备受人们欢迎的网络学习途径.当前制约MOOC能否可持续深入发展的问题聚焦于MOOC学习成果能否得到合理的认证.MOOC学习成果认证分为非学分认证和学分认证.M ...

  6. Python Web Framework All In One

    Python Web Framework All In One Django and Flask are the top Python web frameworks so far. Django ht ...

  7. CSS 滚动条宽度 All In One

    CSS 滚动条宽度 All In One 滚动条宽度 IE 16px Chrome 12px scrollbar width bug 改变设计稿的宽度,没考虑到 scrollbar width sol ...

  8. taro 禁用滚动事件

    taro 禁用滚动事件 禁止 Modal 蒙层下面的页面的内容跟随滚动 https://github.com/NervJS/taro/issues/3980 https://github.com/Ne ...

  9. windows10 安装NASM

    NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...

  10. dart 匹配基本数组

    List<dynamic> evalList(String text) { var r = []; var i = 0; var isList = false; void parseSta ...