在基于产品的二次开发过程中,有时需要对产品项目中预制的某一个策略实现作些修改。但又不想修改策略的路由信息。以免调用方需要更新参数或修改代码等。基于此,对产品的策略接口作了一个小扩展,加上了一个可替换相同策略的boolean函数。效果还可以,可通过继承或新写实现的方式,将默认的策略替换掉。而调用方什么都不用修改。如下:
public interface ChooseTabLoader {
// 匹配tab页查找加载器
static ChooseTabLoader matchChooseTabLoader(String tabCode) {
List<ChooseTabLoader> loaders = ZYSpringUtils.getBeans(ChooseTabLoader.class);
List<ChooseTabLoader> matchLoaders = ZYListUtils.collectCondition(loaders, l -> l.supportTableCode(tabCode));
if (ZYListUtils.isEmptyList(matchLoaders)) {
return null;
}
if (ZYListUtils.isSingletonList(matchLoaders)) {
return matchLoaders.get(FIRST);
}
// 如果在二次开发中,有相同的路由键,取isReplace=ture的,达到替换的目的
ChooseTabLoader replaceLoader = ZYListUtils.anyMatchItem(matchLoaders, ChooseTabLoader::isReplace);
if (null != replaceLoader) {
return replaceLoader;
}
return matchLoaders.get(FIRST);
}
// 策略路由
default boolean supportTableCode(String tableCode) {
return getChooseBee().code().equals(tableCode);
}
// 路由键
ChooseBee getChooseBee();
// 策略需要做的事项
ChooseTab loadChooseTab();
// 相同策略实现的替换标识
default boolean isReplace() {
return false;
}
}
产品策略实现:
@Component
public class CppccNationMemberTabLoader implements ChooseTabLoader {
@Override
public ChooseBee getChooseBee() {
return ModuleUserChooseBee.CPPCC_NATION_MEMBER;
}
@Override
public ChooseTab loadChooseTab() {
return ChooseTabBuilder
.builder(ModuleUserChooseBee.CPPCC_NATION_MEMBER)
.label(ModuleUserChooseBee.CPPCC_NATION_MEMBER_SECTOR)
.label(ModuleUserChooseBee.CPPCC_NATION_MEMBER_STANDING).build();
}
}
二次开发中的实现:
@Component
public class ProjectCppccNationMemberTabLoader implements ChooseTabLoader {
@Override
public ChooseBee getChooseBee() {
return ModuleUserChooseBee.CPPCC_NATION_MEMBER;
}
@Override
public ChooseTab loadChooseTab() {
ChooseTab chooseTab = ChooseTabBuilder
.builder(ModuleUserChooseBee.CPPCC_NATION_MEMBER)
.label(ModuleUserChooseBee.CPPCC_NATION_MEMBER_SECTOR)
.label(ModuleUserChooseBee.CPPCC_NATION_MEMBER_STANDING).build();
// 修改标签名称
chooseTab.setName("市州代表");
List<ChooseLabel> chooseLabels = chooseTab.getChooseLabels();
for (ChooseLabel chooseLabel : chooseLabels) {
chooseLabel.setName("市"+chooseLabel.getName());
}
return chooseTab;
}
@Override
public boolean isReplace() {
return true;
}
}