策略模式实战

1、代码

java 复制代码
package com.ylt.module.operation.strategy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class TableUpdateContext {
    private final Map<String, TableUpdateStrategy> strategyMap;

    @Autowired
    public TableUpdateContext(List<TableUpdateStrategy> strategies) {
        // 将策略列表转换为Map,key为支持的表格类型
        this.strategyMap = strategies.stream()
                .collect(Collectors.toMap(
                        TableUpdateStrategy::getSupportedType,
                        Function.identity()
                ));
    }

    /**
     * 执行表状态更新
     */
    public void executeUpdate(String tableType, Long id, String newStatus) {
        TableUpdateStrategy strategy = strategyMap.get(tableType.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的表格类型: " + tableType);
        }
        strategy.updateStatus(id, newStatus);
    }

    /**
     * 获取文件路径
     */
    public Map<String, Object> getFilePath(String tableType, Long id) {
        TableUpdateStrategy strategy = strategyMap.get(tableType.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的表格类型: " + tableType);
        }
        return strategy.getFilePath(id);
    }
}

2、策略

3、实战

java 复制代码
@Transactional(propagation = Propagation.REQUIRES_NEW)
    public void approveSingle(Long id, Integer status, String reviewMsg) {
        // 单个审批逻辑
        ReviewLogDO reviewLogDO = validateReviewStatus(id, status);
        // 业务表数据更新
        tableUpdateContext.executeUpdate(reviewLogDO.getBusinessType(), reviewLogDO.getBusinessId(), status.toString());
        reviewLogDO.setStatus(status);
        if (StringUtils.isNotBlank(reviewMsg)) {
            reviewLogDO.setReviewMsg(reviewMsg);
        }
        reviewLogDO.setOperator(SecurityFrameworkUtils.getLoginUserNickname());
        reviewLogDO.setOperateTime(LocalDateTime.now());
        logMapper.updateById(reviewLogDO);
    }
java 复制代码
package com.ylt.module.operation.strategy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class TableUpdateContext {
    private final Map<String, TableUpdateStrategy> strategyMap;

    @Autowired
    public TableUpdateContext(List<TableUpdateStrategy> strategies) {
        // 将策略列表转换为Map,key为支持的表格类型
        this.strategyMap = strategies.stream()
                .collect(Collectors.toMap(
                        TableUpdateStrategy::getSupportedType,
                        Function.identity()
                ));
    }

    /**
     * 执行表状态更新
     */
    public void executeUpdate(String tableType, Long id, String newStatus) {
        TableUpdateStrategy strategy = strategyMap.get(tableType.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的表格类型: " + tableType);
        }
        strategy.updateStatus(id, newStatus);
    }

    /**
     * 获取文件路径
     */
    public Map<String, Object> getFilePath(String tableType, Long id) {
        TableUpdateStrategy strategy = strategyMap.get(tableType.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的表格类型: " + tableType);
        }
        return strategy.getFilePath(id);
    }
}
java 复制代码
package com.ylt.module.operation.strategy;

import cn.hutool.core.bean.BeanUtil;
import com.ylt.module.operation.dal.dataobject.company.CompanyDO;
import com.ylt.module.operation.dal.dataobject.contract.ContractDO;
import com.ylt.module.operation.dal.dataobject.reviewLog.BusinessTypeEnum;
import com.ylt.module.operation.dal.mysql.company.CompanyMapper;
import com.ylt.module.operation.enums.BaseConstants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Component
public class CompanyStrategy implements TableUpdateStrategy {
    @Resource
    private CompanyMapper companyMapper;

    /**
     * 支持的表格类型
     */
    @Override
    public String getSupportedType() {
        return BusinessTypeEnum.COMPANY.getKey();
    }

    @Override
    public void updateStatus(Long id, String newStatus) {
        CompanyDO companyDO = companyMapper.selectById(id);
        companyDO.setId(id);
        companyDO.setInfoStatus(newStatus);
        // 审核通过,资料全部通过为开户完成,未通过为开户中
        if(StringUtils.equals(newStatus, BaseConstants.ReviewStatus.STATUS_PASS)){
            //判断首营资质状态
            if (StringUtils.equals(companyDO.getFirstStatus(),BaseConstants.ReviewStatus.STATUS_PASS)) {
                companyDO.setCompanyStatus(BaseConstants.ReviewStatus.STATUS_PASS);
            }else {
                //companyDO.setCompanyStatus(BaseConstants.ReviewStatus.STATUS_REVIEWING);
                companyDO.setCompanyStatus(BaseConstants.ReviewStatus.STATUS_PASS);
            }
        }
        companyMapper.updateById(companyDO);
    }

    @Override
    public Map<String, Object>  getFilePath(Long id) {
        CompanyDO companyDO = companyMapper.selectById(id);
        Map<String, Object> map = BeanUtil.beanToMap(companyDO);
        return map;
    }
}

4、总结

java 复制代码
┌─────────────────────────────────────────┐
│              调用方(Controller)        │
└───────────────────┬─────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────┐
│        TableUpdateContext(上下文)      │
│  ┌─────────────────────────────────┐   │
│  │   strategyMap<String, Strategy> │   │
│  └─────────────────────────────────┘   │
└─────────┬───────────────┬───────────────┘
          │               │
          ▼               ▼
┌─────────────────┐  ┌─────────────────┐
│ CompanyStrategy │  │ ContractStrategy │
│ (单位表逻辑)  │  │ (合同表逻辑)  │
└─────────────────┘  └─────────────────┘
相关推荐
二哈赛车手12 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
geovindu1 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
jimy11 天前
一个夜间期权交易策略的评价
策略模式·程序员创富
harder3214 天前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式
ximu_polaris4 天前
设计模式(C++)-行为型模式-策略模式
c++·设计模式·策略模式
原来是猿6 天前
线程安全的单例模式
linux·服务器·开发语言·单例模式·策略模式
Mr_linjw7 天前
策略模式简介
策略模式
故乡de云7 天前
Cursor + Claude Code 接入 API 实战:国内稳定使用 Claude 4.7 配置全攻略
大模型·ai编程·策略模式·claude·cursor·claude code
原来是猿8 天前
Linux线程同步与互斥(四):日志系统与策略模式
linux·运维·开发语言·策略模式
许国栋_9 天前
ESG驱动下的产品战略调整:企业该如何从合规走向竞争力重构?
安全·产品运营·产品经理·策略模式