java模板、工廠設計模式在項目中的重構


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM