java模板、工厂设计模式在项目中的重构

摘要:
控制器变成如下(任务类型应该写在常量中):当前的开发过程是控制器-->然后转到service调用此任务的业务方法,并从@ServicepublicabstractclassBaseTaskService{publicabstract JSONObjectsaveTask(Tasktask);

场景描述:
  一个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模板、工厂设计模式在项目中的重构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇2.3.7synchronized代码块有volatile同步的功能CentOS6.4安装GlusterFS下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

echarts柱状图多组数据配置

一共三组数据 var map4_data1=[320, 332, 301, 334, 390,360,320, 332, 301, 334, 390,360]; var map4_data2=[220, 182, 191, 234, 290,320,220, 182, 191, 234, 290,320]; var map4_data3=[150, 232...

C#图解教程 第二十章 异步编程

笔记 异步编程 什么是异步 示例 async/await特性的结构什么是异步方法 异步方法的控制流await表达式取消一个异步操作异常处理和await表达式在调用方法中同步地等待任务在异步方法中异步地等待任务Task.Delay方法 在GUI程序中执行异步操作 Task.Yield 使用异步Lambda表达式完整的GUI程序BackgroundW...

Django-celery异步原理与组件(1)

1.Celery异步介绍 1.1celery应用举例 ​ 1.Celery是一个基于python开发的分布式异步消息任务队列,通过它可以轻松实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery。 ​ 2.你想对100台机器执行一条批量命令,可能会花很长时间,但你不想让你的程序等着结果返回,而是给你返回一个任务ID, ​ 你过一...

elasticsearch安装ansj分词器

1、概述    elasticsearch用于搜索引擎,需要设置一些分词器来优化索引。常用的有ik_max_word: 会将文本做最细粒度的拆分、ik_smart: 会做最粗粒度的拆分、ansj等。    ik下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases    ansj下...

Activemq Jolokia

打开JMX <broker … useJmx="true"> …   <managementContext>             <managementContext createConnector="true"/>     </managementContext> </broker> 启动A...

人工智能与智能家居

1.家庭AI系统的任务 在智能家居中应用人工智能技术,需要构建承载人工智能算法的家庭AI系统。家庭AI系统用以实现两类家庭任务: (1)家庭设备的控制任务。 这类任务需要系统通过分析用户使用数据,按照用户习惯自动控制家庭内部设备、或调整家庭内环境状态。例如Nest温控器,按照用户习惯控制房间温度,并且兼顾节能。 (2)家庭状态的监测任务。 这类任务需要系统...