相同点
-
行为委托
两者均通过将行为委托给其他对象来实现功能解耦,遵循“组合优于继承”的原则。 -
类结构相似
两者在类图结构上高度相似,均包含:-
上下文类(Context):持有策略或状态对象的引用。
-
抽象接口(Strategy/State):定义行为方法的统一接口。
-
具体实现类(ConcreteStrategy/ConcreteState):实现具体行为。
-
-
开闭原则
均支持扩展新的策略或状态,无需修改现有代码。
不同点
维度 | 策略模式 | 状态模式 |
---|---|---|
核心目的 | 灵活替换算法 | 管理对象的状态转换 |
控制权 | 客户端主动选择策略 | 状态对象自动触发状态转换 |
依赖关系 | 策略之间相互独立 | 状态之间可能相互依赖 |
生命周期 | 策略的生命周期由客户端管理 | 状态的转换由上下文或状态自身管理 |
典型场景 | 算法选择(排序、支付方式) | 对象状态管理(订单、游戏角色状态) |
代码复杂度 | 简单,仅需替换策略 | 复杂,需处理状态转换逻辑 |
应用场景示例
策略模式:支付方式选择
// 抽象策略接口
class PaymentStrategy {
public:virtual void pay(int amount) = 0;
};// 具体策略类:信用卡支付
class CreditCardPayment : public PaymentStrategy {
public:void pay(int amount) override {std::cout << "Paid " << amount << " via Credit Card." << std::endl;}
};// 具体策略类:支付宝支付
class AlipayPayment : public PaymentStrategy {
public:void pay(int amount) override {std::cout << "Paid " << amount << " via Alipay." << std::endl;}
};// 上下文类(订单)
class Order {
private:PaymentStrategy* strategy;
public:void setStrategy(PaymentStrategy* strategy) {this->strategy = strategy;}void checkout(int amount) {strategy->pay(amount);}
};// 使用示例
int main() {Order order;CreditCardPayment creditCard;AlipayPayment alipay;order.setStrategy(&creditCard);order.checkout(100); // 输出: Paid 100 via Credit Card.order.setStrategy(&alipay);order.checkout(200); // 输出: Paid 200 via Alipay.
}
状态模式:订单状态管理
// 抽象状态接口
class OrderState {
public:virtual void handle(OrderContext* context) = 0;
};// 具体状态类:待付款
class PendingPaymentState : public OrderState {
public:void handle(OrderContext* context) override {std::cout << "Processing payment..." << std::endl;context->setState(new PaidState()); // 状态转换}
};// 具体状态类:已付款
class PaidState : public OrderState {
public:void handle(OrderContext* context) override {std::cout << "Order is paid. Preparing for shipment." << std::endl;context->setState(new ShippedState());}
};// 上下文类(订单)
class OrderContext {
private:OrderState* state;
public:OrderContext() : state(new PendingPaymentState()) {}void setState(OrderState* newState) {delete state;state = newState;}void proceed() {state->handle(this);}
};// 使用示例
int main() {OrderContext order;order.proceed(); // 输出: Processing payment... → 状态变为 PaidStateorder.proceed(); // 输出: Order is paid. Preparing for shipment. → 状态变为 ShippedState
}