策略模式实战

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 │
│ (单位表逻辑)  │  │ (合同表逻辑)  │
└─────────────────┘  └─────────────────┘
相关推荐
ting94520002 天前
Minimi 深度技术剖析:macOS 端侧全量上下文采集与 Claude 本地 RAG 联动架构详解
macos·架构·策略模式
Qimooidea3 天前
MacOS 平台 CAD 图纸翻译实战:从技术挑战到高效落地
macos·策略模式
张小姐的猫3 天前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
铁锚4 天前
macOS 禁用 mediaanalysisd
macos·策略模式
Dr_eamboat5 天前
SpringBoot策略模式+工厂模式实战解析
linux·spring boot·策略模式
basketball6167 天前
设计模式入门:7. 策略模式详解 C++实现
c++·设计模式·策略模式
Java_2017_csdn10 天前
Java 策略模式(Strategy Pattern)-(二)
java·开发语言·策略模式
Java_2017_csdn10 天前
Java 策略模式(Strategy Pattern)-(一)
java·开发语言·策略模式
拾光Ծ10 天前
【Linux系统编程】线程池项目实战与基于策略模式的日志系统
linux·bash·线程池·策略模式·日志