由于需要判断业务找到对应的实现类,又不想写太多if else,然后参考了这篇文章https://www.cnblogs.com/davidwang456/p/10831546.html
就测试了一下简单工厂模式,把心路历程记一下。有些涉及业务具体实现的就省略了
业务场景
该项目就是一个web项目,这里的业务简单概括为,前端传来 表名
,id
等信息,通过表名去找到对应业务的实现方法
接口类
public interface Operation {
//编辑
String declareInfo(param1,param2,XXService xxService);
//撤回
String rollback(param1, XXService xxService);
//删除
String delDeclare(param);
}
评审业务实现
@Service
public class Assess implements Operation {
@Override
public String declareInfo(param1,param2,xxService xxService) {
//do sth
return new AssessController(xxService).editAssess(request);
}
@Override
public String rollback(param1, XXService xxService) {
//do sth
return new AssessController(xxService).rollBackPerson();
}
@Override
public String delDeclare(param) {
//do sth
return new AssessController().delAssessInfo();
}
}
考试申报业务实现
@Service
public class Exam implements Operation {
@Override
public String declareInfo(param1,param2,XXService xxService) {
//do sth
return new EnterController(enterService).appraisalDeclare(request);
}
@Override
public String rollback(param1, XXService xxService) {
//do sth
return new EnterController(enterService).rollBackPerson();
}
@Override
public String delDeclare(param) {
//do sth
return new EnterController().delEnterInfo();
}
}
后面其他业务实现就直接省略了,差的只是业务不同而已
工厂类
public class OperatorFactory {
static Map<String, Operation> operationMap = new HashMap<>();
static {
//考试报名
operationMap.put("表名1", new Exam());
//评审报名
operationMap.put("表名2", new Assess());
//职务认定
operationMap.put("表名3", new Believe());
//证书补办
operationMap.put("表名4", new Certificate());
}
public static Optional<Operation> getOperation(String operation) {
return Optional.ofNullable(operationMap.get(operation));
}
}
控制层(前端访问地址)
@RequestMapping({"editDeclare.do"})
public String editDeclare(HttpServletRequest request){
//参数获取
Operation targetOperation = OperatorFactory
.getOperation(dto.getAsString("tableName"))
.orElseThrow(() -> new IllegalArgumentException("没找到申报类型"));
return targetOperation.declareInfo(request,dto,enterService);
}
剩下两种业务也只是调用接口方法不同
途中遇到的问题
- 该项目为前端工程(也不算前端项目吧,有点微服务的意思),业务处理直接在控制层去调用其他业务工程的接口实现,这边之前图省事加了一个service。
在实现类调用控制层时,因为也没有把Controller注册到Bean容器,所以也没发在实现类去加注解添加实例,然后我就直接new的,但是这样的话 控制层中的service也就没有取到,然后我直接在前端调用的控制层那里获取service再通过参数传过去。
然后把用到的控制层的依赖注入由接口注入改为构造器注入
private xxService xxService;
@Autowired
public EnterController(xxService xxService) {
//参数构造方法
this.xxService = xxService;
}
public EnterController() {
//无参构造方法
}
虽然问题解决了,但是总感觉怪怪的....
然后又深入了解了一下工厂模式,后续有时间再改吧!现在理解还不透彻,先把任务提交一下,免得领导问。
网友评论