当前位置: 首页 > article >正文

策略模式(Strategy Pattern)与状态模式(State Pattern)的异同

相同点
  1. 行为委托
    两者均通过将行为委托给其他对象来实现功能解耦,遵循“组合优于继承”的原则。

    • 策略模式:将算法逻辑委托给具体的策略类。

    • 状态模式:将状态相关的行为委托给具体的状态类。

  2. 类结构相似
    两者在类图结构上高度相似,均包含:

    • 上下文类(Context):持有策略或状态对象的引用。

    • 抽象接口(Strategy/State):定义行为方法的统一接口。

    • 具体实现类(ConcreteStrategy/ConcreteState):实现具体行为。

  3. 开闭原则
    均支持扩展新的策略或状态,无需修改现有代码。


不同点
维度策略模式状态模式
核心目的灵活替换算法管理对象的状态转换
控制权客户端主动选择策略状态对象自动触发状态转换
依赖关系策略之间相互独立状态之间可能相互依赖
生命周期策略的生命周期由客户端管理状态的转换由上下文或状态自身管理
典型场景算法选择(排序、支付方式)对象状态管理(订单、游戏角色状态)
代码复杂度简单,仅需替换策略复杂,需处理状态转换逻辑

应用场景示例

策略模式:支付方式选择
// 抽象策略接口
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... → 状态变为 PaidState
    order.proceed();  // 输出: Order is paid. Preparing for shipment. → 状态变为 ShippedState
}

总结

  • 策略模式:关注算法的灵活替换,由客户端主动控制策略的选择。

  • 状态模式:关注对象内部状态的动态转换,状态变化由上下文或状态自身触发。

两者在结构上相似,但设计目标和适用场景不同。策略模式是“静态多态”,而状态模式是“动态多态”


http://www.kler.cn/a/586507.html

相关文章:

  • ROS2基础——Linux
  • LeetCode热题100——技巧
  • 05 | 使用 Cobra 包来构建你的 Go 项目
  • pytorch训练权重转化为tensorflow模型的教训
  • Https SSL证书配置
  • 蓝桥杯 阶乘求值
  • 边缘计算与 PCDN 的融合:未来网络架构新趋势​
  • 关于ModbusTCP/RTU协议对接Ethernet/IP(CIP)协议的方案
  • 智能家居分享
  • AI 革命再提速:从 Manus 封停到 OpenAI 开源,技术竞赛与伦理博弈下的产业变局
  • 力扣 754 到达终点数字 思路讲解
  • 快速使用Python爬虫根据关键词获取衣联网商品列表:实战指南
  • 【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)
  • 亚马逊自养号测评,IP纯净度的重要性
  • 使用Composer实现自动加载类
  • 指令微调 (Instruction Tuning) 与 Prompt 工程
  • Spring @RequestMapping 注解详解
  • python--面试题--基础题
  • 优化 Java 数据结构选择与使用,提升程序性能与可维护性
  • 云原生大佬重生,记忆逐步复苏(十三:selinux模块)