1.前言

       上一篇章就通过简单的案例来了解抽象工厂模式和策略模式的使用,现在就用个支付场景的小案例来演示两者设计模式的联合使用;

1.示例说明

       一个支付系统支持微信,支付宝,银联,数字人民币等多渠道的支付,但是每个支付渠道,在大致的流程上都相差无异,比如支付的处理,参数,秘钥等校验,日志的跟踪;

1.1定义通用接口

// 支付处理器
public interface PaymentProcessor {
    void processPayment(double amount);
}

// 风控策略接口(策略模式)
public interface RiskControl {
    void checkRisk();
}

// 日志记录器
public interface Logger {
    void log(String message);
}

1.2 定义抽象工厂

public interface PaymentFactory {
    PaymentProcessor createProcessor();
    RiskControl createRiskControl(); // 策略模式接口
    Logger createLogger();
}

1.3 支付宝实现

// 支付宝支付处理器
public class AlipayProcessor implements PaymentProcessor {
    public void processPayment(double amount) {
        System.out.println("使用支付宝处理支付:" + amount + " 元");
    }
}

// 支付宝风控策略
public class AlipayRiskControl implements RiskControl {
    public void checkRisk() {
        System.out.println("支付宝风控检查通过");
    }
}

// 支付宝日志
public class AlipayLogger implements Logger {
    public void log(String message) {
        System.out.println("支付宝日志:" + message);
    }
}

// 支付宝工厂(组合策略)
public class AlipayPaymentFactory implements PaymentFactory {
    public PaymentProcessor createProcessor() {
        return new AlipayProcessor();
    }

    public RiskControl createRiskControl() {
        return new AlipayRiskControl();
    }

    public Logger createLogger() {
        return new AlipayLogger();
    }
}

1.4 微信实现

public class WeChatProcessor implements PaymentProcessor {
    public void processPayment(double amount) {
        System.out.println("使用微信处理支付:" + amount + " 元");
    }
}

public class WeChatRiskControl implements RiskControl {
    public void checkRisk() {
        System.out.println("微信风控检查通过");
    }
}

public class WeChatLogger implements Logger {
    public void log(String message) {
        System.out.println("微信日志:" + message);
    }
}

public class WeChatPaymentFactory implements PaymentFactory {
    public PaymentProcessor createProcessor() {
        return new WeChatProcessor();
    }

    public RiskControl createRiskControl() {
        return new WeChatRiskControl();
    }

    public Logger createLogger() {
        return new WeChatLogger();
    }
}

1.5 客户端使用代码(组合使用)

public class PaymentService {

    private final PaymentProcessor processor;
    private final RiskControl riskControl; // 策略注入
    private final Logger logger;

    public PaymentService(PaymentFactory factory) {
        this.processor = factory.createProcessor();
        this.riskControl = factory.createRiskControl(); // 策略模式
        this.logger = factory.createLogger();
    }

    public void pay(double amount) {
        logger.log("开始支付流程");
        riskControl.checkRisk(); // 策略模式核心调用
        processor.processPayment(amount);
        logger.log("支付完成");
    }

    public static void main(String[] args) {
        // 使用支付宝
        PaymentFactory alipayFactory = new AlipayPaymentFactory();
        PaymentService alipayService = new PaymentService(alipayFactory);
        alipayService.pay(100.0);

        System.out.println("---------");

        // 使用微信
        PaymentFactory weChatFactory = new WeChatPaymentFactory();
        PaymentService weChatService = new PaymentService(weChatFactory);
        weChatService.pay(200.0);
    }
}

1.6 示例结果输出

支付宝日志:开始支付流程
支付宝风控检查通过
使用支付宝处理支付:100.0 元
支付宝日志:支付完成
---------
微信日志:开始支付流程
微信风控检查通过
使用微信处理支付:200.0 元
微信日志:支付完成

1.7 总结

特点描述
抽象工厂统一创建每种支付渠道的组件(处理器、日志器、风控)
策略模式将风控逻辑抽象出来,可替换、可扩展
组合使用每种渠道内部组合策略,不影响外部调用逻辑
易扩展新增一个支付渠道,只需新增实现类和一个工厂
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐