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

文章介绍了如何在不修改原有路由信息的情况下,通过在产品策略接口中添加可替换策略的功能,实现在二次开发中替换特定策略。开发者可以通过继承或新写实现方式,仅改变isReplace标志来达到替换目的,无需调用方做任何修改。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值