一、定义枚举类
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
//IBaseEnum 在java开发常用基类有提到
public enum PublishEnum implements IBaseEnum {
PUBLISHONE(1, "发布1"),
PUBLISHRTWO(2, "发布2" ),
;
private final Integer value;
private final String desc;
}
二、创建工厂来生成对应service
@Service
public class PublishFactory {
@Autowired
private BeanFactory beanFactory;
public PublishService getImplService(PublishEnum publishEnum ) {
switch (publishEnum) {
case FANS_GROUP_IMAGE_UPLOAD:
return beanFactory.getBean(PUBLISHONEService.class);
case CREATE_FANS_GROUP:
return beanFactory.getBean(PUBLISHRTWOService.class);
default: //自定义异常
throw new APIException(ResultCode.ERROR, "无效的服务类型");
}
}
}
三、service
@Slf4j
@Service
public class PublishOneService extends CallbackService {
@Override
@Transactional(rollbackFor = Exception.class)
public DyScanCallbackVo scanCallback(String code, String companyId) {}
@Slf4j
@Service
public class PublishTwoService extends CallbackService {
@Override
@Transactional(rollbackFor = Exception.class)
public DyScanCallbackVo scanCallback(String code, String companyId) {}
@Service
public abstract class CallbackService {
public abstract DyScanCallbackVo scanCallback(String code, String companyId);
}
四、应用
public class AppController{
@Autowired
private PublishFactory publishFactory;
public void add(int type,int code,String companyId)
PublishEnum publishEnum = IBaseEnumin.convert(type, PublishEnum .class);
publishFactory.getImplService(publishEnum).scanCallback(code,companyId)
}
}
如果不使用策略模式的话,代码是长这样的,当后面service类型慢慢增多就会变得越来越难维护
public class AppController{
@Autowired
private PublishFactory publishFactory;
public void add(int type,int code,String companyId)
if(type==1){
PublishOneService.scanCallback(code,companyId)
}
if(type==2){
PublishTwoService.scanCallback(code,companyId)
}
}