抽象工厂模式与策略模式结合使用小案例
·
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 总结
| 特点 | 描述 |
|---|---|
| 抽象工厂 | 统一创建每种支付渠道的组件(处理器、日志器、风控) |
| 策略模式 | 将风控逻辑抽象出来,可替换、可扩展 |
| 组合使用 | 每种渠道内部组合策略,不影响外部调用逻辑 |
| 易扩展 | 新增一个支付渠道,只需新增实现类和一个工厂 |
更多推荐
所有评论(0)