策略模式实战

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 │
│ (单位表逻辑)  │  │ (合同表逻辑)  │
└─────────────────┘  └─────────────────┘
相关推荐
回忆2012初秋1 天前
策略模式完整实现:物流价格计算引擎
策略模式
x-cmd2 天前
macOS 内存模型深度解析 | x free 设计哲学
linux·macos·内存·策略模式·free·x-cmd
互联网散修2 天前
零基础鸿蒙应用开发第二十九节:策略模式重构电商促销系统
重构·策略模式·鸿蒙零基础入门
无籽西瓜a2 天前
【西瓜带你学设计模式 | 第十五期 - 策略模式】策略模式 —— 算法封装与动态替换实现、优缺点与适用场景
java·后端·设计模式·软件工程·策略模式
互联网散修3 天前
零基础鸿蒙应用开发第二十八节:商品排序体系之工厂与策略模式
策略模式·鸿蒙
stevenzqzq3 天前
架构设计深度解析:策略模式 + 抽象工厂在UI适配中的高级应用
ui·策略模式
tiger从容淡定是人生7 天前
可审计性:AI时代自动化测试的核心指标
人工智能·自动化·项目管理·策略模式·可用性测试·coo
都说名字长不会被发现8 天前
模版方法 + 策略模式在库存增加/扣减场景下的应用
策略模式·模板方法模式·宏命令·策略聚合·库存设计
默|笙8 天前
【Linux】进程概念与控制(2)_进程控制
java·linux·策略模式