场景描述:
  一个controller中,部门领导有布置任务,查看任务整体情况,查看部门成员,查看部门成员完成情况,导出任务详情,如下:

   @RestController
@RequestMapping(value = "/task")
public class TaskController{ @PostMapping(value = "/saveTask")
public JSONObject saveTask(Task task){
...
} @PostMapping(value = "/taskDetail")
public JSONObject taskDetail(Task task){
...
} @PostMapping(value = "/memberList")
public JSONObject memberList(Task task){
...
} @PostMapping(value = "/memberDetail")
public JSONObject memberDetail(Task task){
...
} @PostMapping(value = "/exportTask")
public JSONObject exportTask(Task task){
...
}
}

过了一段时间后,新需求来了,之前任务是需求任务,现在任务种类多了一个测试任务,但是接口要公用一套。所以Task加了一个type的字段用来区分不同的任务,1:原来类型的任务,2:测试任务,controller变成如下(Task的类型type应该写在常量里面):

@RestController
@RequestMapping(value = "/task")
public class TaskController{ @PostMapping(value = "/saveTask")
public JSONObject saveTask(Task task){
if( Constants.COMMON_TASK == task.type){
...
}else if( Constants.TEST_TASK == task.type){
...
}
} @PostMapping(value = "/taskDetail")
public JSONObject taskDetail(Task task){
if( Constants.COMMON_TASK == task.type){
...
}else if( Constants.TEST_TASK == task.type){
...
}
} @PostMapping(value = "/memberList")
public JSONObject memberList(Task task){
if( Constants.COMMON_TASK == task.type){
...
}else if( Constants.TEST_TASK == task.type){
...
}
} @PostMapping(value = "/memberDetail")
public JSONObject memberDetail(Task task){
if( Constants.COMMON_TASK == task.type){
...
}else if( Constants.TEST_TASK == task.type){
...
}
} @PostMapping(value = "/exportTask")
public JSONObject exportTask(Task task){
if( Constants.COMMON_TASK == task.type){
...
}else if( Constants.TEST_TASK == task.type){
...
}
}
}

  再之后又有新任务类型加进来,继续往这个controller的几个方法中增加if-else。目前的开发流程是controller-->service-->dao,判断那种任务,然后走到service调用这个任务的业务方法,现在使用多态的方法把if-else语句重构掉

  首先创建一个抽象类,把共同的方法抽离出来

        @Service
public abstract class BaseTaskService{ public abstract JSONObject saveTask(Task task); public abstract JSONObject taskDetail(Task task); public abstract JSONObject memberList(Task task); public abstract JSONObject memberDetail(Task task); public abstract JSONObject exportTask(Task task); }

  然后不同的任务继承这个抽象类,具体的业务逻辑在自己的类上处理,需求任务:

        @Service
public class CommonTask extends BaseTaskService{ @Ovreride
public JSONObject saveTask(Task task){
...
} @Ovreride
public JSONObject taskDetail(Task task){
...
} @Ovreride
public JSONObject memberList(Task task){
...
} @Ovreride
public JSONObject memberDetail(Task task){
...
} @Ovreride
public JSONObject exportTask(Task task){
...
}
}

  测试任务:

        @Service
public class TestTask extends BaseTaskService{ @Ovreride
public JSONObject saveTask(Task task){
...
} @Ovreride
public JSONObject taskDetail(Task task){
...
} @Ovreride
public JSONObject memberList(Task task){
...
} @Ovreride
public JSONObject memberDetail(Task task){
...
} @Ovreride
public JSONObject exportTask(Task task){
...
}
}

  再之后创建工厂类返回任务类

  

@Service
public class TaskFactory{ @Autowired
private CommonTask commonTask;
@Autowired
private TestTask testTask;
... public BaseTaskService getTask(Integer type){
if(Constants.COMMON_TASK.equals(type){
return commonTask;
}else if(Constants.TestTask.equals(type){
return testTask;
}else if(...){
...
}
...
}
}

  最后修改controller就大功告成

        @RestController
@RequestMapping(value = "/task")
public class TaskController{ @Autowired
private TaskFactory taskFactory; @PostMapping(value = "/saveTask")
public JSONObject saveTask(Task task){
BaseTaskService currentTask = taskFactory.getTask(task);
return currentTask.saveTask(task);
} @PostMapping(value = "/taskDetail")
public JSONObject taskDetail(Task task){
BaseTaskService currentTask = taskFactory.getTask(task);
return currentTask.taskDetail(task);
} @PostMapping(value = "/memberList")
public JSONObject memberList(Task task){
BaseTaskService currentTask = taskFactory.getTask(task);
return currentTask.memberList(task);
} @PostMapping(value = "/memberDetail")
public JSONObject memberDetail(Task task){
BaseTaskService currentTask = taskFactory.getTask(task);
return currentTask.memberDetail(task);
} @PostMapping(value = "/exportTask")
public JSONObject exportTask(Task task){
BaseTaskService currentTask = taskFactory.getTask(task);
return exportTask(task);
}
}

  

记一次java简单的if语句使用多态重构的更多相关文章

  1. java基础-控制流程语句

    一 前言 周末睡觉好舒服,都不想动了,就想睡睡,晒晒太阳,作者劳碌命还是过来写文章了.基础系列文章已经已经出到控制流程,感觉也挺快的,我很自信全网没都多少系列文章能有我这基础系列写的这么好,易于初学者 ...

  2. java简单学生成绩管理系统

    题目要求: 一. 数据结构要求:(5 分) 1.定义 ScoreInformation 类,其中包括七个私有变量(stunumber, name, mathematicsscore, englishi ...

  3. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  4. java 中for each语句

    [转]java foreach 使用   foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便.   foreach语句是for语句的特殊简化版本 ...

  5. Java中的return语句使用总结

    Java中的return语句总是和方法有密切关系,return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句).   在 ...

  6. Java基础—控制流程语句(条件语句与循环结构)

    与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.Java的控制流程结构与C和C++的控制流程机构一样,只有很少的例外情况.没有goto语句,但break语句可以带标签,可以利用它实 ...

  7. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  8. java的if else语句入门

    条件语句,是程序中根据条件是否成立进行选择执行的一类语句,这类语句在实际使用中,难点在于如何准确的抽象条件.例如实现程序登录功能时,如果用户名和密码正确,则进入系统,否则弹出“密码错误”这样的提示框等 ...

  9. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

随机推荐

  1. NX二次开发-MFC对话框获取UG界面句柄,设置MFC对话框在UG界面固定显示位置

    extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) { if (UF_initiali ...

  2. css3 动画+动画库

    css3 动画 实现原理 1.transition 过渡:https://www.runoob.com/cssref/css3-pr-transition.html 语法:( transition的 ...

  3. mongo分组查询(转)

    1. 多字段分组 {"$group":{"_id": {"state": "$state", "city&qu ...

  4. jmeter 环境java监视和管理控制

    打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——>输入cmd——>然后在出现的命令行界面输入“jco ...

  5. monkeyrunner 进行多设备UI测试

    monkeyrunner进行多设备UI测试  首先你要连接好多个手机设置好已经连接好的手机的ip列表ipp = ['192xxx','192xxx']杀掉之前所有appium进程subprocess. ...

  6. Django+paramiko实现webshell

    说明 基于 python3.7 + django 2.2.3 实现的 django-webshell,支持颜色显示,支持 tab 命令补全,项目地址:https://github.com/leffss ...

  7. Centos7.4安装elasticsearch6.3+kibana6.3集群

    Centos7.4安装elasticsearch+kibana集群 Centos7.4安装elasticsearch+kibana集群 主机环境 软件环境 主机规划 主机安装前准备 安装jdk1.8 ...

  8. 我的vscode配置 利用Settings Sync一键安装

    { "prettier.eslintIntegration": true, // 点击保存时,根据 eslint 规则自定修复,同时集成 prettier 到 eslint 中 & ...

  9. quartz的使用(三)

    1.在数据源数据库中执行下载的quartz的sql语句(创建11张表),其中表头qrtz_可以在在配置文件中更改,对应表创建时更改org.quartz.jobStore.tablePrefix=qrt ...

  10. 【JZOJ6419】模拟旅行&【BZOJ5506】【luoguP5304】旅行者

    description 某国有n座城市,这些城市之间通过m条单向道路相连,已知每条道路的长度. 不过,小X只对其中k座城市感兴趣. 为了更好地规划模拟旅行路线,提升模拟旅行的体验,小X想要知道他感兴趣 ...