当前位置: 首页 > article >正文

使用策略模式时的一个生效问题

策略模式的替换场景:
1:产品有默认策略A,B,项目扩展策略C,此为正常扩展。
2:产品有默认策略A,B,项目需要改写策略B,此为项目替换默认策略。
3:产品有默认策略A,B,项目扩展策略C,产品需要反向扩展策略C,并对C进行修改。此时,由于项目的策略是先生成的,处于已使用的状态,产品属于是后补充,不能对项目C策略有影响。此为产品反向补充策略C.

也不知说明白没有,其实也简单,两个布尔值随便玩下

public interface ColumnCondition{
	// 是否是产品出厂自带的策略
    default boolean isOriginal() {
        return false;
    }
	// 是否是项目替换的策略
    default boolean isReplace() {
        return false;
    }
	// 支持的策略标识
    boolean support(String businessCode);
	// 处理上下文
    void doBusiness(Context context);

判断逻辑如下:


	@AutowiredFalse
    private List<ColumnCondition> columnConditions; // 所有策略

   public ColumnCondition matchColumnCondition(String businessCode) {
   		// 没有策略
        if (ListUtils.isEmptyList(columnConditions)) {
            return null;
        }

		// 匹配出支持当前code的策略
        List<ColumnCondition> matchConditions = ListUtils.collectCondition(this.columnConditions, c -> c.support(businessCode));
        if (ListUtils.isEmptyList(matchConditions)) {
            return null;
        }
        // 情况1:只有一种策略,直接使用即可
        if (ListUtils.isSingletonList(matchConditions)) {
            return matchConditions.get(FIRST);
        }

        // 情况2:项目替换产口的某条策略
        for (ColumnCondition matchCondition : matchConditions) {
            if (matchCondition.isReplace()) {
                return matchCondition;
            }
        }

        // 情况3:产品改写项目已有的策略,不对项目的该策略产生影响
        for (ColumnCondition matchCondition : matchConditions) {
            if (!matchCondition.isOriginal()) {
                return matchCondition;
            }
        }
        // 返回第一条策略:此处是不精确的,但也是能执行的。一般业务是能满足的
        return matchConditions.get(FIRST);
    }

http://www.kler.cn/a/463077.html

相关文章:

  • 4.微服务灰度发布落地实践(消息队列增强)
  • NestJS 性能优化:从应用到部署的最佳实践
  • FPGA的FIFO
  • 数据挖掘——认识数据
  • SQL-Server链接服务器访问Oracle数据
  • 【蓝桥杯】:蓝桥杯之路径之谜
  • 机器人C++开源库The Robotics Library (RL)使用手册(四)
  • 关于ElasticSearch
  • 搭建医疗产品行业知识中台的手册
  • 深度学习在文本情感分析中的应用
  • 基于Redis的分布式锁
  • easybox
  • 【YashanDB知识库】hive初始化崖山报错YAS-04209
  • 万里数据库GreatSQL监控解析
  • 永嘉县瓯北六小:庆元旦,献爱心,让新永嘉人在童装节中找到归属感!
  • Golang学习历程【第五篇 复合数据类型:数组切片】
  • ShardingSphere-Proxy分表场景测试案例
  • CPT203 Software Engineering 软件工程 Pt.4 软件设计(中英双语)
  • Spring 核心技术解析【纯干货版】- II:Spring 基础模块 Spring-Beans 模块精讲
  • pyside6总结