策略模式+代理模式实现

背景

在业务处理的过程中,可能会遇到接收某些参数,通过参数来判断要走不同的逻辑,不同的策略,这时候就可以用到策略模式。

如果在策略执行之前或者之后需要有一些公共的操作,那么就通过代理模式来实现。

下面是实现的demo

demo

java 复制代码
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * @author 消息处理回执策略
 */

@Slf4j
@Getter
public enum DouBackStrategyEnum {

    //默认的校验回执类型,无需处理
    TAG_0("doNothingStrategy"),
    //订单创建
    TAG_100("createOrderStrategy"),
    //订单支付/确认
    TAG_101("paidOrderStrategy"),
    //订单取消
    TAG_106("canceledOrderStrategy"),
    //订单已支付,待处理
    TAG_110("tradePendingOrderStrategy"),
    ;

    private final String strategyClassName;

    DouBackStrategyEnum(String strategyClassName) {
        this.strategyClassName = strategyClassName;
    }

    public static DouBackStrategyEnum getEnum(String code){
        try {
            return DouBackStrategyEnum.valueOf(DouBackStrategyEnum.class, code);
        }catch (Exception e){
            log.info("无对应策略,只需要存储,使用默认类 TAG_0");
            return TAG_0;
        }

    }
}
java 复制代码
/**
 * @author 
 * 这里的入参是我当前业务的对象,在真正使用中,需要替换为自己的业务对象data
 */
public interface DouBackStrategy {
    void execute(JSONObject data);
}
java 复制代码
/**
 * @author 
 * 无处理逻辑的其他消息
 */
@Component
public class DoNothingStrategy implements DouBackStrategy {
    @Override
    public void execute(JSONObject data) {
        System.out.println("Do nothing strategy executed with data: " + data.toString());
    }
}
java 复制代码
/**
 * @author 
 * 创建订单消息策略
 */
@Slf4j
@Component
public class CreateOrderStrategy implements DouBackStrategy {
    @Override
    public void execute(JSONObject data) {
        log.info("CreateOrderStrategy 订单创建处理逻辑 data:{}", JSON.toJSONString(data));
    }
}
java 复制代码
/**
 * @author  
 * 用户支付消息执行策略
 */
@Slf4j
@Component
public class PaidOrderStrategy implements DouBackStrategy {

    @Override
    public void execute(JSONObject data) {
        log.info("PaidOrderStrategy 接收订单支付成功消息 data:{}", JSON.toJSONString(data));
    }
}
java 复制代码
/**
 * @author 
 * @date 
 * 策略回执数据代理类
 */
@Slf4j
class DouBackStrategyProxy implements DouBackStrategy {

    //代理类中的注入 对象需要传进来,因为每个代理对象都是new的
    private final DouMessageService douMessageService;
    private final DouBackStrategy strategy;
    private final DistributeIdHelper distributeIdHelper;

    public DouBackStrategyProxy(DouBackStrategy strategy, DouMessageService douMessageService, DistributeIdHelper distributeIdHelper) {
        this.strategy = strategy;
        this.douMessageService = douMessageService;
        this.distributeIdHelper = distributeIdHelper;
    }

    @Override
    public void execute(JSONObject data) {
        // 在执行策略之前进行存储操作
        log.info("消息存入数据库 data: {}", JSONObject.toJSONString(data));
        long dateLong = System.currentTimeMillis();
        DouMessageEntity douMessageEntity = new DouMessageEntity();
        douMessageEntity.setId(distributeIdHelper.getSnowflakeId());
        douMessageService.save(douMessageEntity);
        // 执行策略
        strategy.execute(data);
    }
}
java 复制代码
/**
 * @author 
 * 获取策略上下文
 */
@Slf4j
@Service
public class DouBackStrategyContext {
    private DouBackStrategy strategy;

    @Resource
    private StrategyFactory strategyFactory;

    public void setStrategy(DouBackStrategyEnum tag) {
        this.strategy = strategyFactory.createStrategy(tag);
    }

    public void executeStrategy(JSONObject data) {
        if (strategy != null) {
            strategy.execute(data);
        } else {
            log.error("策略为空, data:{}", data.toJSONString());
        }
    }
}

使用

java 复制代码
    @Resource
    private DouBackStrategyContext douBackStrategyContext;

    @Override
    @PostMapping("/back")
    public void back(@RequestParam("param") String param) {
        JSONArray objects = JSONObject.parseArray(param);
        for (Object ob : objects) {
            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(ob));
            DouBackStrategyEnum tagEnum = DouBackStrategyEnum.getEnum("TAG_" + jsonObject.getString("tag"));
            douBackStrategyContext.setStrategy(tagEnum);
            douBackStrategyContext.executeStrategy(jsonObject);
        }
    }
相关推荐
意法半导体STM3211 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
山东点狮信息科技有限公司12 天前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
zzqssliu12 天前
基于策略模式与责任链的代购商品多源采集架构实战
架构·策略模式
mxpan13 天前
macOS 13+ 上使用 macFUSE + NTFS-3G 读写 NTFS 移动硬盘技术说明
macos·策略模式
许彰午13 天前
36_Java设计模式之代理模式
java·设计模式·代理模式
折哥的程序人生 · 物流技术专研13 天前
Java 23 种设计模式:从踩坑到精通 | 番外:编排器+策略模式在多平台电子面单中的实战(含性能压测)
设计模式·策略模式·代码重构·java设计模式·编排器·电子面单·从踩坑到精通
忧云14 天前
2026年最新 Cursor 国内使用 DeepSeek API等各模型使用完整教程
ai编程·策略模式·cursor·byok·cursor使用国内大模型
AIex-YH14 天前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
回忆2012初秋15 天前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
怎么没有名字注册了啊15 天前
macOS 基于 CSDN GitCode + Homebrew Tap 发布 Qt .app 二进制程序通用教程(homebrew 安装自己的软件)
策略模式·homebrew·formula·ruhy