目录
- 1.前言
- 1.示例说明
- 1.1定义通用接口
- 1.2 定义抽象工厂
- 1.3 支付宝实现
- 1.4 微信实现
- 1.5 客户端使用代码(组合使用)
- 1.6 示例结果输出
- 1.7 总结
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 总结
特点 | 描述 |
---|---|
抽象工厂 | 统一创建每种支付渠道的组件(处理器、日志器、风控) |
策略模式 | 将风控逻辑抽象出来,可替换、可扩展 |
组合使用 | 每种渠道内部组合策略,不影响外部调用逻辑 |
易扩展 | 新增一个支付渠道,只需新增实现类和一个工厂 |