场景描述:
  一个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. android API版本对应的系统版本及Android获取手机和系统版本等信息的代码

    学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...

  2. (转)微信,QQ这类IM app怎么做——谈谈Websocket

    转:http://www.cocoachina.com/ios/20160527/16482.html 前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕 ...

  3. HDU2586---How far away ?(lca算法)

    Problem Description There are n houses in the village and some bidirectional roads connecting them. ...

  4. 其它课程中的python---5、Pandas处理数据和读取数据

    其它课程中的python---5.Pandas处理数据和读取数据 一.总结 一句话总结: 记常用和特例:慢慢慢慢的就熟了,不用太着急,慢慢来 库的使用都很简单:就是库的常用函数就这几个,后面用的时候学 ...

  5. 制作linux根文件系统

    转载地址:http://wenku.baidu.com/view/2cb1b4707fd5360cba1adb14.html 2011十一月 24 转 嵌入式根文件系统制作 (3985) (0) 转自 ...

  6. VC++ 2010 创建高级Ribbon界面详解(2)

    Ribbon 控件的使用 1.命令按钮 命令按钮可以说是我们最常用的Ribbon控件了,我们通常都是通过命令按钮来发送某个命令,执行某个动作.它代替了过去的菜单命令,成为使用最频繁的Ribbon控件. ...

  7. centos7.2下快速安装zabbix4.0

    本笔记是基于CentOS 7.2下最小化安装的操作系统搭建的Zabbix4.0环境,主要用于做一些企业路由器和交换机等设备的运行状态监控. 1.安装epel源 yum -y install epel- ...

  8. 第十二篇 requests模拟登陆知乎

    了解http常见状态码 可以通过输入错误的密码来找到登陆知乎的post:url 把Headers拉到底部,可以看到form data _xsrf是需要发送的,需要发送给服务端,否则会返回403错误,提 ...

  9. mysql数据库 --表查询

    今日内容: 一.单表查询 1.语法执行顺序 2.where约束条件 3.group by 4.having 5.distinct 6.order by 7.limit 8.正则 二.多表查询 1.表查 ...

  10. Jquery中$.get(),$.post(),$.ajax(),$.getJSON(),$.getScript(),$.load()的用法总结

    参考文档 :  https://blog.csdn.net/jiandanokok/article/details/48809717 本文是对Jquery中$.get(),$.post(),$.aja ...