C++状态机
#include <iostream>
#include <unordered_map>
#include <string>
enum class PaymentEvent {
PAY_CREATE,
PAY_PROCESS,
PAY_SUCCESS,
PAY_FAIL
};
class PaymentStatus {
public:
// 枚举状态
enum Status {
INIT,
PAYING,
PAID,
FAILED
};
// 构造函数
PaymentStatus(Status status, const std::string& description)
: status(status), description(description) {}
// 获取目标状态
static Status getTargetStatus(Status sourceStatus, PaymentEvent event);
// 打印状态信息
void printStatus() const {
std::cout << "Status: " << description << std::endl;
}
private:
Status status;
std::string description;
};
// 自定义哈希函数
namespace std {
template <>
struct hash<std::pair<PaymentStatus::Status, PaymentEvent>> {
size_t operator()(const std::pair<PaymentStatus::Status, PaymentEvent>& p) const {
// 一种简单的哈希组合方法
return std::hash<int>()(static_cast<int>(p.first)) ^ std::hash<int>()(static_cast<int>(p.second));
}
};
}
// 静态映射表,存储状态转换
std::unordered_map<std::pair<PaymentStatus::Status, PaymentEvent>, PaymentStatus::Status> stateTransitions = {
{{PaymentStatus::INIT, PaymentEvent::PAY_CREATE}, PaymentStatus::PAYING},
{{PaymentStatus::PAYING, PaymentEvent::PAY_PROCESS}, PaymentStatus::PAID},
{{PaymentStatus::PAYING, PaymentEvent::PAY_FAIL}, PaymentStatus::FAILED}
// 添加其他状态转换
};
// 获取目标状态的静态方法实现
PaymentStatus::Status PaymentStatus::getTargetStatus(Status sourceStatus, PaymentEvent event) {
auto it = stateTransitions.find({sourceStatus, event});
if (it != stateTransitions.end()) {
return it->second;
} else {
return sourceStatus; // 默认情况下保持原状态
}
}
int main() {
PaymentStatus paymentStatusInit(PaymentStatus::INIT, "初始化");
PaymentStatus paymentStatusPaying(PaymentStatus::PAYING, "支付中");
PaymentStatus paymentStatusPaid(PaymentStatus::PAID, "支付成功");
PaymentStatus paymentStatusFailed(PaymentStatus::FAILED, "支付失败");
paymentStatusInit.printStatus();
PaymentStatus::Status newStatus = PaymentStatus::getTargetStatus(PaymentStatus::INIT, PaymentEvent::PAY_CREATE);
paymentStatusPaying = PaymentStatus(newStatus, "支付中");
paymentStatusPaying.printStatus();
return 0;
}