自学内容网 自学内容网

对策略设计模式的一个小扩展

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

原文地址:https://blog.csdn.net/qq_37148232/article/details/137666908

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!