设计模式之手写策略模式实现动态支付(Java实现)

首先,定义一个接口类

java 复制代码
import java.util.Map;

public interface PayInterface {
    /**
     * 支付方法
     * @param amount 支付金额
     * @param paymentInfo 支付信息(如卡号、密码等)
     * @return 支付结果
     */
    boolean pay(double amount, Map<String, String> paymentInfo);
}

再写俩个实现类

java 复制代码
import java.util.Map;

public class Pay1 implements PayInterface {
    @Override
    public boolean pay(double amount, Map<String, String> paymentInfo) {
        System.out.println("使用支付宝支付:" + amount + "元");
        // 实际支付宝支付逻辑...
        // 验证支付信息
        // 调用支付宝API
        // 处理支付结果
        return true; // 假设支付成功
    }
}
java 复制代码
import java.util.Map;

public class Pay2 implements PayInterface {
    @Override
    public boolean pay(double amount, Map<String, String> paymentInfo) {
        System.out.println("使用微信支付:" + amount + "元");
        // 实际微信支付逻辑...
        // 验证支付信息
        // 调用微信支付API
        // 处理支付结果
        return true; // 假设支付成功
    }
}

此时就把支付逻辑的类写完了。

再封装一个上下文信息的类。

java 复制代码
import java.util.Map;

/**
 * 支付上下文
 */
class PaymentContext {
    private PayInterface paymentStrategy;

    public PaymentContext(PayInterface paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void setPaymentStrategy(PayInterface paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public boolean executePayment(double amount, Map<String, String> paymentInfo) {
        return paymentStrategy.pay(amount, paymentInfo);
    }
}

以及一个生成支付实例的工厂类

java 复制代码
public class PayFactory {
    public static PayInterface getStrategy(String paymentType) {
        switch (paymentType.toLowerCase()) {
            case "alipay":
                return new Pay1();
            case "wechat":
                return new Pay2();
            default:
                throw new IllegalArgumentException("不支持的支付方式: " + paymentType);
        }
    }
}

此时准备工作完成了。

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // 准备支付信息
        Map<String, String> paymentInfo = new HashMap<>();
        paymentInfo.put("account", "user123");
        paymentInfo.put("password", "123456");
        paymentInfo.put("cardNumber", "622588******1234"); // 银行卡支付需要


        // 创建支付上下文
        PaymentContext context = new PaymentContext(PayFactory.getStrategy("wechat"));

        // 使用支付宝支付
        boolean result1 = context.executePayment(100.0, paymentInfo);
        System.out.println("支付宝支付结果: " + (result1 ? "成功" : "失败"));

        // 动态切换到微信支付
        context.setPaymentStrategy(PayFactory.getStrategy("alipay"));
        boolean result2 = context.executePayment(200.0, paymentInfo);
        System.out.println("微信支付结果: " + (result2 ? "成功" : "失败"));

        //添加银行卡支付方式,可以通过动态代理的方式进行实现,不展开介绍可以看看proxy包的实现

    }
}

此时就完成了 一个支付模块的设计,能够支持动态选择支付方式,而不是大量的ifelse操作,

但是以上还有很多增加的点,

比如工厂类的写法有待改进,上面只是简单写法,还有如果需要动态的创建新的支付方式呢,难道只能停止运行创建完再手动运行吗?这样太麻烦了,我们可以使用动态代理的方式在运行期进行创建支付方式,怎么创建呢?

需要有一定的动态代理基础,我们写一个接口,能够生成统一模板的支付类,并将其编译加载到JVM中,然后验证其正确性和稳定性,最后将其注册到工厂类中即可供用户使用。

深入理解Java的动态代理机制,手写一个简易的动态代理-CSDN博客

相关推荐
砍材农夫9 小时前
物联网 基于netty构建mqtt协议规范(遗嘱与保留消息)
java·开发语言·物联网·netty
DFT计算杂谈9 小时前
KPROJ编译教程
java·前端·python·算法·conda
重生之我是Java开发战士9 小时前
【笔试强训】Week5:空调遥控, kotor和气球,走迷宫,主持人调度II,体操队形,二叉树的最大路径和,排序子序列,消减整数
java·算法·动态规划
郑重其事,鹏程万里10 小时前
表达式计算器(mvel2)
java
其实防守也摸鱼10 小时前
软件安全与漏洞--软件安全编码
java·前端·网络·安全·网络安全·web·工具
888CC++10 小时前
栈上分配 VS 堆分配 核心区别
java·开发语言·jvm
艾利克斯冰10 小时前
Java面试题汇总
java
魔法阵维护师10 小时前
从零开发游戏需要学习的c#模块,第十章(设计模式入门)
学习·游戏·设计模式·c#
用户3563029048710 小时前
【设计模式】组合模式——树形结构的统一处理
设计模式
我是一颗柠檬10 小时前
【JavaSE全面教学】Java集合框架下Day13(2026年)
java·开发语言·intellij-idea