1、定义一个枚举存放“具体策略实现类-”-TypeInfoEnums
public enum TypeInfoEnums {
MT540("AB","AB", ABByIdInfoServiceImpl.class.getSimpleName()),
MT545("CD","CD", CDByIdInfoServiceImpl.class.getSimpleName());
private String name;
private String value;
private String className;
// 构造方法
TypeInfoEnums(String name, String value, String className) {
this.name = name;
this.value = value;
this.className = className;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public static TypeInfoEnums getTypeEnumsByName(String name) {
TypeInfoEnums[] typeEnums = TypeInfoEnums.values();
TypeInfoEnums result = null;
for (TypeInfoEnums typeEnum : typeEnums) {
if (typeEnum.getValue().equals(name)) {
result = typeEnum;
break;
}
}
return result;
}
}
2、实现层调用“抽象策略类”-BaseByIdRouteServiceImple
@Service
public class BaseByIdRouteServiceImple implements BaseByIdRouteService {
@Autowired
private BaseDao baseDao;
@Autowired
private Map<String, BaseByIdService> BaseByIdServiceMap;
@Override
public Object queryBaseById(Long Id) {
LambdaQueryWrapper<BaseEntity> baseWrapper = new LambdaQueryWrapper<>();
baseWrapper.eq(BaseEntity::getId, Id);
BaseEntity baseEntity = baseDao.selectOne(baseWrapper);
if (baseEntity == null) {
throw new RRException("不存在Id为" + Id + "数据");
}
TypeInfoEnums typeEnums =
TypeInfoEnums.getTypeEnumsByName(baseEntity.getType());
if (null == typeEnums ) {
throw new RRException("类型无法识别,请校准!");
}
String className = StrUtil.lowerFirst(typeEnums.getClassName());
BaseByIdService baseByIdService = baseByIdServiceMap.get(className);
return baseByIdService.QueryBaseById(Id);
}
}
3、抽象策略类-BaseByIdService
public interface BaseByIdService {
Object QueryBaseById(BaseEntity baseEntity);
}
4、具体策略实现类
(1)第一种类型策略实现类-ABByIdInfoServiceImpl
@Service
public class ABByIdInfoServiceImpl implements BaseByIdService {
@Override
public Object QueryBaseById(BaseEntity baseEntity) {
//查看的代码实现
return AB类型对应的查询结果映射对象;
}
}
(2)第二种类型策略实现类-CDByIdInfoServiceImpl
@Service
public class CDByIdInfoServiceImpl implements BaseByIdService {
@Override
public Object QueryBaseById(BaseEntity baseEntity) {
//查看的代码实现
return CD类型对应的查询结果映射对象;
}
}