場景描述:
一個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); } }