前言
SpringBoot项目,通过枚举+接口+实现类实现一个简单的工厂模式,逻辑比较简单,通过选择不同的确权方式来选择具体的确权实现类
注: 确权是我们自己的项目逻辑,你可以把它当成任何其他的逻辑,比如支付
代码
枚举
展示了几种确权方式
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public enum ConfirmationType {
CORAL(1, "珊瑚链证书确权", ConfirmationServerName.CONFIRMATION_CORAL),
TSA(2, "数字时间戳证书确权", ConfirmationServerName.CONFIRMATION_TSA),
TDCHAIN(3, "信源链证书确权", ConfirmationServerName.CONFIRMATION_TBCHAIN),
;
public int code;
public String desc;
public String serviceName;
public static ConfirmationType getByCode(int code) {
return Arrays.stream(ConfirmationType.values())
.filter(x -> x.getCode() == code)
.findFirst()
.<ApiException>orElseThrow(() -> {
log.warn("确权方式[{}]暂不支持", code);
throw new ApiException(BadRequestCode.PARAM_ERROR.getCode(), "暂不支持其他确权方式");
});
}
public static class ConfirmationServerName {
public final static String CONFIRMATION_CORAL = "coralConfirmationService";
public final static String CONFIRMATION_TSA = "tsaConfirmationService";
public final static String CONFIRMATION_TBCHAIN = "tbChainConfirmationService";
}
}
确权接口
public interface IConfirmationService {
/**
* 确权逻辑
*/
ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo);
}
确权具体实现
确权方式一:
@Service(ConfirmationType.ConfirmationServerName.CONFIRMATION_CORAL)
@Slf4j
public class CoralConfirmationServiceImpl implements IConfirmationService {
@Override
public ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo) {
// 具体逻辑
// ...
return null;
}
}
确权方式二:
@Slf4j
@Service(ConfirmationType.ConfirmationServerName.CONFIRMATION_TBCHAIN)
public class TbChainConfirmationServiceImpl implements IConfirmationService {
@Override
public ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo) {
// 具体逻辑
// ...
return null;
}
}
确权方式三:
...
简单工厂
@Component
@Slf4j
public class ConfirmationServiceFactory {
@Resource
Map<String, IConfirmationService> confirmationServiceMaps;
public IConfirmationService getInstance(ConfirmationType type) {
return confirmationServiceMaps.entrySet().stream()
.filter(entry -> type.getServiceName().equalsIgnoreCase(entry.getKey()))
.findFirst()
.<ApiException>orElseThrow(() -> {
log.error("找不到指定的确权服务 确权类型为:{} 确权描述为:{}", type.getCode(), type.getDesc());
throw new ApiException(BadRequestCode.INTERNAL_ERROR);
})
.getValue();
}
}
通过工厂调用具体实现
// 注入
@Resource
private ConfirmationServiceFactory confirmationServiceFactory;
// 具体实现
public Result<String> doConfirm(ConfirmationParam confirmationParam) {
// 执行确权
IConfirmationService iConfirmationService = confirmationServiceFactory.getInstance(confirmationType);
ConfirmResult confirm = iConfirmationService.confirm(confirmationParam, developerInfo);
// ...
return null;
}