支付策略
#include <iostream>
#include <memory>
#include <unordered_map>
#include <vector>
#include <ctime>// 基礎策略接口
class PaymentStrategy {
public:virtual ~PaymentStrategy() = default;virtual std::string name() const = 0;virtual bool validate(double amount, const std::string& currency) const = 0;virtual void pay(double amount, const std::string& currency) const = 0;virtual double calculate_fee(double amount) const = 0;
};// 策略工廠系統
class StrategyFactory {
public:using StrategyCreator = std::function<std::unique_ptr<PaymentStrategy>()>;static StrategyFactory& instance() {static StrategyFactory instance;return instance;}void register_strategy(const std::string& id, StrategyCreator creator) {creators_[id] = creator;}std::unique_ptr<PaymentStrategy> create(const std::string& id) const {if (auto it = creators_.find(id); it != creators_.end()) {return it->second();}return nullptr;}std::vector<std::string> available_strategies() const {std::vector<std::string> names;for (const auto& [id, _] : creators_) {names.push_back(id);}return names;}private:std::unordered_map<std::string, StrategyCreator> creators_;
};// 自動注冊宏
#define REGISTER_PAYMENT_STRATEGY(StrategyClass, strategy_id) \namespace { \struct AutoRegister_##StrategyClass { \AutoRegister_##StrategyClass() { \StrategyFactory::instance().register_strategy( \strategy_id, \[]{ return std::make_unique<StrategyClass>(); } \); \} \}; \AutoRegister_##StrategyClass auto_reg_##StrategyClass; \}// 微信支付策略
class WechatPayStrategy : public PaymentStrategy {const double max_amount_ = 50000.0; // 單筆最大金額public:std::string name() const override { return "WeChat Pay"; }bool validate(double amount, const std::string& currency) const override {return currency == "CNY" && amount <= max_amount_;}void pay(double amount, const std::string& currency) const override {std::cout << "微信支付成功\n"<< "金額: ¥" << amount << "\n"<< "請在小程序確認支付" << std::endl;}double calculate_fee(double amount) const override {return amount * 0.001; // 0.1%手續費}
};
REGISTER_PAYMENT_STRATEGY(WechatPayStrategy, "wechat_pay");// PayPal策略
class PayPalStrategy : public PaymentStrategy {const std::vector<std::string> supported_currencies_{"USD", "EUR", "GBP"};public:std::string name() const override { return "PayPal"; }bool validate(double amount, const std::string& currency) const override {return std::find(supported_currencies_.begin(), supported_currencies_.end(), currency) != supported_currencies_.end();}void pay(double amount, const std::string& currency) const override {std::cout << "Processing PayPal payment\n"<< "Amount: " << currency << " " << amount << "\n"<< "Redirecting to PayPal login..." << std::endl;}double calculate_fee(double amount) const override {return std::max(0.3, amount * 0.05); // 5% + $0.3}
};
REGISTER_PAYMENT_STRATEGY(PayPalStrategy, "paypal");// 比特幣策略(帶實時匯率)
class BitcoinStrategy : public PaymentStrategy {// 模擬實時匯率獲取double get_bitcoin_price() const {static const double BASE_PRICE = 45000.0; // 基礎價格// 模擬價格波動return BASE_PRICE * (1.0 + 0.1 * sin(time(nullptr) % 3600));}public:std::string name() const override { return "Bitcoin"; }bool validate(double amount, const std::string& currency) const override {return currency == "BTC" || currency == "USD";}void pay(double amount, const std::string& currency) const override {if (currency == "USD") {double btc_amount = amount / get_bitcoin_price();std::cout << "Converting USD to BTC: " << "?" << btc_amount << std::endl;amount = btc_amount;}std::cout << "區塊鏈交易確認中...\n"<< "轉賬金額: ?" << amount << "\n"<< "預計確認時間: 10分鐘" << std::endl;}double calculate_fee(double amount) const override {return 0.0001 * get_bitcoin_price(); // 固定礦工費}
};
REGISTER_PAYMENT_STRATEGY(BitcoinStrategy, "bitcoin");// 支付處理器
class PaymentProcessor {std::unordered_map<std::string, std::unique_ptr<PaymentStrategy>> strategies_;public:void load_strategy(const std::string& id) {if (auto strategy = StrategyFactory::instance().create(id)) {strategies_[id] = std::move(strategy);}}void process_payment(const std::string& currency, double amount) {auto strategy = select_strategy(currency, amount);if (!strategy) {throw std::runtime_error("No available payment method");}std::cout << "\n=== 支付方式: " << strategy->name() << " ==="<< "\n金額: " << currency << " " << amount<< "\n手續費: " << strategy->calculate_fee(amount)<< "\n-------------------------" << std::endl;strategy->pay(amount, currency);}private:PaymentStrategy* select_strategy(const std::string& currency, double amount) {// 選擇優先級:本地支付 > 國際支付 > 加密貨幣for (auto& [id, strategy] : strategies_) {if (id == "wechat_pay" && strategy->validate(amount, currency)) {return strategy.get();}}for (auto& [id, strategy] : strategies_) {if (id == "alipay" && strategy->validate(amount, currency)) {return strategy.get();}}for (auto& [id, strategy] : strategies_) {if (strategy->validate(amount, currency)) {return strategy.get();}}return nullptr;}
};// 使用示例
int main() {PaymentProcessor processor;// 加載所有注冊的支付方式for (const auto& id : StrategyFactory::instance().available_strategies()) {processor.load_strategy(id);}// 人民幣支付try {processor.process_payment("CNY", 200.0);processor.process_payment("CNY", 60000.0); // 應觸發異常} catch (const std::exception& e) {std::cerr << "支付失敗: " << e.what() << std::endl;}// 美元支付processor.process_payment("USD", 500.0);// 比特幣支付processor.process_payment("BTC", 0.1);processor.process_payment("USD", 1000.0); // 自動轉換為BTCreturn 0;
}
代碼解析
- 策略擴展機制
REGISTER_PAYMENT_STRATEGY(WechatPayStrategy, "wechat_pay");
- 自動注冊:通過宏實現新策略的零配置接入
- 唯一標識:每個策略有唯一的注冊ID(如wechat_pay)
- 微信支付實現
class WechatPayStrategy : public PaymentStrategy {bool validate(...) { /* 校驗人民幣 */ }void pay(...) { /* 微信特有流程 */ }
};
- 本地化支持:僅接受人民幣
- 移動支付流程:模擬小程序支付場景
- PayPal國際支付
class PayPalStrategy : public PaymentStrategy {bool validate(...) { /* 支持多幣種 */ }void pay(...) { /* 跳轉PayPal */ }
};
- 多幣種支持:USD/EUR/GBP
- 典型手續費模型:固定費用+百分比
- 比特幣支付
class BitcoinStrategy : public PaymentStrategy {double get_bitcoin_price() { /* 模擬實時價格 */ }void pay(...) { /* 自動轉換法幣 */ }
};
- 加密貨幣支持:直接接受BTC或自動轉換USD
- 動態手續費:基于當前幣價計算礦工費
- 智能策略選擇
PaymentStrategy* select_strategy(...) {// 優先選擇本地支付方式// 次選國際支付// 最后考慮加密貨幣
}
- 業務優先級:體現支付方式選擇策略
- 動態路由:根據金額和幣種自動路由
執行結果示例
=== 支付方式: WeChat Pay ===
金額: CNY 200
手續費: 0.2
-------------------------
微信支付成功
金額: ¥200
請在小程序確認支付支付失敗: No available payment method=== 支付方式: PayPal ===
金額: USD 500
手續費: 25.3
-------------------------
Processing PayPal payment
Amount: USD 500
Redirecting to PayPal login...=== 支付方式: Bitcoin ===
金額: BTC 0.1
手續費: 4.5
-------------------------
區塊鏈交易確認中...
轉賬金額: ?0.1
預計確認時間: 10分鐘=== 支付方式: Bitcoin ===
金額: USD 1000
手續費: 4.5
-------------------------
Converting USD to BTC: ?0.0221132
區塊鏈交易確認中...
轉賬金額: ?0.0221132
預計確認時間: 10分鐘
待擴展
-
新增策略步驟:
- 繼承
PaymentStrategy
實現新類 - 實現所有純虛函數
- 使用
REGISTER_PAYMENT_STRATEGY
注冊
- 繼承
-
動態配置:
// 示例:從JSON加載策略配置 void load_config(const json& config) {for (auto& item : config["strategies"]) {auto strategy = factory.create(item["id"]);strategy->configure(item["params"]);add_strategy(std::move(strategy));} }
-
混合支付:
class SplitPaymentStrategy : public PaymentStrategy {// 支持多個策略分攤支付void pay(...) override {credit_card_->pay(part1, currency);crypto_->pay(part2, currency);} };