在基于产品的二次开发过程中,有时需要对产品项目中预制的某一个策略实现作些修改。但又不想修改策略的路由信息。以免调用方需要更新参数或修改代码等。基于此,对产品的策略接口作了一个小扩展,加上了一个可替换相同策略的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 {@Overridepublic ChooseBee getChooseBee() {return ModuleUserChooseBee.CPPCC_NATION_MEMBER;}@Overridepublic 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 {@Overridepublic ChooseBee getChooseBee() {return ModuleUserChooseBee.CPPCC_NATION_MEMBER;}@Overridepublic 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;}@Overridepublic boolean isReplace() {return true;}
}