记一次java简单的if语句使用多态重构
场景描述:
一个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语句使用多态重构的更多相关文章
- java基础-控制流程语句
一 前言 周末睡觉好舒服,都不想动了,就想睡睡,晒晒太阳,作者劳碌命还是过来写文章了.基础系列文章已经已经出到控制流程,感觉也挺快的,我很自信全网没都多少系列文章能有我这基础系列写的这么好,易于初学者 ...
- java简单学生成绩管理系统
题目要求: 一. 数据结构要求:(5 分) 1.定义 ScoreInformation 类,其中包括七个私有变量(stunumber, name, mathematicsscore, englishi ...
- 【java开发】分支语句、循环语句学习
一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...
- java 中for each语句
[转]java foreach 使用 foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本 ...
- Java中的return语句使用总结
Java中的return语句总是和方法有密切关系,return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句). 在 ...
- Java基础—控制流程语句(条件语句与循环结构)
与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.Java的控制流程结构与C和C++的控制流程机构一样,只有很少的例外情况.没有goto语句,但break语句可以带标签,可以利用它实 ...
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- java的if else语句入门
条件语句,是程序中根据条件是否成立进行选择执行的一类语句,这类语句在实际使用中,难点在于如何准确的抽象条件.例如实现程序登录功能时,如果用户名和密码正确,则进入系统,否则弹出“密码错误”这样的提示框等 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
随机推荐
- es6学习笔记--箭头函数
基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...
- echarts更新数据的方法
//初始创建 var myChart = echarts.init(document.getElementById('main')); var option = {........} myChart. ...
- java Logger 类
package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...
- thinkphp 表单令牌
表单令牌 ThinkPHP支持表单令牌验证功能,可以有效防止表单的重复提交等安全防护.要启用表单令牌功能,需要配置行为绑定, 在应用或者模块的配置目录下面的行为定义文件tags.php中 就是在你的 ...
- python 出现indentationError:expected an indented block!
出现这个问题,代码一般是没问题的,剩下你要考虑: 1. 缩进对齐是否有问题 2. python脚本的格式是啥,如果你在linux上运行,编码需要是unix; (大部分情况下,我们是在windows下 ...
- XStream环境设置
为Windows 2000/XP设置路径: 假设安装在c:Program Filesjavajdk目录: 在“我的电脑”右键单击并选择“属性”. 在“高级”选项卡下单击“环境变量”按钮. 现在,改变“ ...
- 2014 mathtype分块列向量输入 PPT动画制作
1.mathtype分块列向量的输入 http://zhidao.baidu.com/link?url=pV7TazWe-Ld5qgxNcJCQdRaA8ILEgmXRP211F5U0Cst0xNfU ...
- 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别
一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表 ...
- 净心诀---python3装饰器
python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...
- C# 编译生成 产生多余的语言包删除"de" "en" "es" "fr" "hu" "it" "ja" "ko" "pr-br" "ro" "pt-br" "ru" "sv" "zh-hans" "zh-hant&qu
VS生成事件 rd /s /q "de" "en" "es" "fr" "hu" "it& ...