工厂模式加策略执行的代码-设计
service的调用
CompletableFutureUtil 多线程执行工具类
public EnterpriseTplDataByKeysResp getEnterpriseTplDataByKeys(EnterpriseTplDataByKeysReq req) {
EnterpriseTplDataByKeysResp enterpriseTplDataByKeysResp = new EnterpriseTplDataByKeysResp();
CompletableFutureUtil completableFutureUtil = CompletableFutureUtil.getInstance(GlobalThreadPool.getExecutor());
req.getTplModuleKey().forEach(key -> {
completableFutureUtil.supplyAsync(() -> {
var mapService = EnterpriseTplDataAbstract.keyTypeClassMap.get(key);
if (ObjUtil.isNull(mapService)) {
throw PlatformException.buildException(PlatformExceptionCode.NOT_FOUND, "模板不存在,请检查EnterpriseTplDataAbstract.keyTypeClassMap的配置");
}
EnterpriseTplDataByKeysDTO enterpriseTplData = mapService.getEnterpriseTplData(req);
if (ObjUtil.isNotNull(enterpriseTplData)) {
BeanUtil.copyProperties(enterpriseTplData, enterpriseTplDataByKeysResp, new CopyOptions().setIgnoreNullValue(true));
}
return true;
});
});
completableFutureUtil.allOf();
completableFutureUtil.shutdown();
return enterpriseTplDataByKeysResp;
}
抽象类设计
public abstract class EnterpriseTplDataAbstract {
public static final Map<EnterpriseTplType, EnterpriseTplDataAbstract> keyTypeClassMap = MapUtil.newHashMap();
public abstract EnterpriseTplType getEnterpriseTplModelKey();
public abstract EnterpriseTplDataByKeysDTO getEnterpriseTplData(EnterpriseTplDataByKeysReq req);
public static void register(EnterpriseTplType enterpriseTplType, EnterpriseTplDataAbstract obj) {
keyTypeClassMap.put(enterpriseTplType, obj);
}
}
枚举设计
public enum EnterpriseTplType {
@Schema(description = "视频")
VIDEO,
}
实现类
为什么要实现InitializingBean 呢,因为在spring创建bean的时候,就把当前类的保存到map里面,给予工厂调用
@Service
@RequiredArgsConstructor
public class EnterpriseArticleImpl extends EnterpriseTplDataAbstract implements InitializingBean {
final BizArticleService bizArticleService;
@Override
public EnterpriseTplType getEnterpriseTplModelKey() {
return EnterpriseTplType.ARTICLE;
}
@Override
public EnterpriseTplDataByKeysDTO getEnterpriseTplData(EnterpriseTplDataByKeysReq req) {
var res = new EnterpriseTplDataByKeysDTO();
if (ObjUtil.isNull(req.getParams())
&& ObjUtil.isNull(req.getParams().get(this.getEnterpriseTplModelKey()))) {
res.getErrorMap().put(this.getEnterpriseTplModelKey(), "请求参数有误");
return res;
}
var ids = JSON.parseArray(JSON.toJSONString(req.getParams().get(this.getEnterpriseTplModelKey())), Long.class);
var bizArticles = bizArticleService.getList(req.getTenantId(), ids);
if (CollUtil.isEmpty(bizArticles)) {
res.getErrorMap().put(this.getEnterpriseTplModelKey(), "ids查询不到数据");
return res;
}
res.setArticle(bizArticles);
return res;
}
@Override
public void afterPropertiesSet() {
EnterpriseTplDataAbstract.register(getEnterpriseTplModelKey(), this);
}
}