Spring框架下使用策略模式

本文探讨了策略模式在支付路由中的应用,通过不同渠道类实现参数校验、创建订单、请求发送及结果处理的可替换逻辑,展示了如何使用抽象通道和具体实现如支付宝、新浪支付和微信支付来灵活处理各种支付场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式, 即根据不同的参数, 调用不同业务流程, 但各流程的逻辑基本类似.

真实场景

支付路由, 根据不同的渠道参数, 进行不同的调用. 但具有类似逻辑: 参数校验->本地创建订单->发送请求->根据结果做不同的处理.

AbstractChannel

抽象类, 定义了各渠道的整体架构

public abstract class AbstractChannel {

    public void handle() {
        check();
        createOrder();
        String result = doRequest();
        processResult(result);
    }

    private void createOrder() {
        // 创建本地订单
        System.out.println("Create order");
    }

    /**
     * 执行请求结果
     * @param result 请求结果
     */
    private void processResult(String result) {
        if (result == null) {
            throw new RuntimeException("Result is null");
        }
        switch (result) {
            case "success":
                System.out.println("Process success");
                break;
            case "failed":
                System.out.println("Process failed");
                break;
        }
        System.out.println("Process finished");
    }

    /**
     * 发起请求
     */
    public abstract String doRequest();

    /**
     * 检查参数
     */
    public abstract void check();

}

Channel

定义3个渠道

@Service("alipay")
public class AlipayChannel extends AbstractChannel {

    @Override
    public void check() {
        System.out.println("Alipay check...");
    }

    @Override
    public String doRequest() {
        System.out.println("Alipay doHandle...");
        return "success";
    }

}

@Service("sinaPay")
public class SinaPayChannel extends AbstractChannel {

    @Override
    public void check() {
        System.out.println("SinaPay check...");
    }

    @Override
    public String doRequest() {
        System.out.println("SinaPay doHandle...");
        return "success";
    }

}

@Service("wechatPay")
public class WechatPayChannel extends AbstractChannel {

    @Override
    public void check() {
        System.out.println("WechatPay check...");
    }

    @Override
    public String doRequest() {
        System.out.println("WechatPay doHandle...");
        return "success";
    }

}

Controller

测试入口

@RestController
public class IndexController {

    @Autowired
    Map<String, AbstractChannel> channelMap;

    @GetMapping("/strategy")
    public Object strategy(@RequestParam("channel") String channel) {
        channelMap.get(channel).handle();
        return null;
    }

}

测试结果

访问 http://127.0.0.1:8080/strategy?channel=alipay

AliPay check...
Create order
AliPay doHandle...
Process success
Process finished
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值