目錄
- 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 總結
特點 | 描述 |
---|---|
抽象工廠 | 統一創建每種支付渠道的組件(處理器、日志器、風控) |
策略模式 | 將風控邏輯抽象出來,可替換、可擴展 |
組合使用 | 每種渠道內部組合策略,不影響外部調用邏輯 |
易擴展 | 新增一個支付渠道,只需新增實現類和一個工廠 |