欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记一次java简单的if语句使用多态重构

程序员文章站 2022-06-20 17:05:56
场景描述: 一个controller中,部门领导有布置任务,查看任务整体情况,查看部门成员,查看部门成员完成情况,导出任务详情,如下: 过了一段时间后,新需求来了,之前任务是需求任务,现在任务种类多了一个测试任务,但是接口要公用一套。所以Task加了一个type的字段用来区分不同的任务,1:原来类型 ......

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