策略模式+代理模式实现

背景

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

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

下面是实现的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);
        }
    }
相关推荐
庞轩px2 天前
第六篇:Spring用了哪些设计模式?——从单例到代理,拆解框架中的经典设计
java·spring·设计模式·bean·代理模式·aop·单例
多加点辣也没关系2 天前
数据结构与算法|第二十四章:算法思维总结与实战
算法·代理模式
c++之路2 天前
代理模式(Proxy Pattern)
开发语言·c++·代理模式
丷丩4 天前
策略模式实战:GeoAI-UP中MVT发布器的可扩展架构设计
人工智能·架构·gis·策略模式·空间分析·geoai
码界奇点5 天前
基于策略模式的多数据源爬虫系统设计与实现
爬虫·python·毕业设计·策略模式·源代码管理·数据库系统
05候补工程师5 天前
【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
python·设计模式·pdf·word·策略模式
qq_三哥啊8 天前
【mitmproxy】通过 mitmproxy 的HTTP代理模式获取 OpenCode 发起的 AI API 请求的详细信息
网络·http·代理模式
风筝在晴天搁浅8 天前
美团 手撕策略模式
策略模式
AI人工智能+电脑小能手9 天前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
AI人工智能+电脑小能手10 天前
【大白话说Java面试题】【Java基础篇】第29题:静态代理和动态代理的区别是什么
java·开发语言·后端·面试·代理模式