【C++】【设计模式】状态模式

【C++】【设计模式】状态模式

定义

  • 行为型模式
  • 允许一个对象在其内部状态改变时改变其行为,看起来就像是改变了其类一样。

结构

  • 抽象状态
  • 具体状态
  • 上下文

UML类图

在这里插入图片描述

#include <iostream>
#include <string>

class Order;

class OrderState {
public:
    virtual ~OrderState() {}
    virtual void cancel(Order& order) {}
    virtual void ship(Order& order) {}
    virtual void complete(Order& order) {}
};

class PendingState : public OrderState {
public:
    void cancel(Order& order) override;
    void ship(Order& order) override;
};

class ShippedState : public OrderState {
public:
    void cancel(Order& order) override;
    void complete(Order& order) override;
};

class DeliveredState : public OrderState {
public:
    void cancel(Order& order) override;
    void complete(Order& order) override;
};

class CompletedState : public OrderState {
public:
    void cancel(Order& order) override;
};

class CanceledState : public OrderState {
public:
    void ship(Order& order) override;
    void complete(Order& order) override;
};

class Order {
public:
    Order();
    ~Order();
    void setState(OrderState* state);
    void cancel();
    void ship();
    void complete();
private:
    OrderState* m_state;
};

Order::Order() {
    m_state = new PendingState();
}

Order::~Order() {
    if (m_state != nullptr) {
        delete m_state;
    }
}

void Order::setState(OrderState* state) {
    if (m_state != state) {
        delete m_state;
        m_state = state;
    }
}

void Order::cancel() {
    m_state->cancel(*this);
}

void Order::ship() {
    m_state->ship(*this);
}

void Order::complete() {
    m_state->complete(*this);
}

void PendingState::cancel(Order& order) {
    std::cout << "Order canceled" << std::endl;
    order.setState(new CanceledState());
}

void PendingState::ship(Order& order) {
    std::cout << "Order shipped" << std::endl;
    order.setState(new ShippedState());
}

void ShippedState::cancel(Order& order) {
    std::cout << "Cannot cancel shipped order" << std::endl;
}

void ShippedState::complete(Order& order) {
    std::cout << "Order delivered" << std::endl;
    order.setState(new DeliveredState());
}

void DeliveredState::cancel(Order& order) {
    std::cout << "Cannot cancel delivered order" << std::endl;
}

void DeliveredState::complete(Order& order) {
    std::cout << "Order completed" << std::endl;
    order.setState(new CompletedState());
}

void CompletedState::cancel(Order& order) {
    std::cout << "Cannot cancel completed order" << std::endl;
}

void CanceledState::ship(Order& order) {
    std::cout << "Cannot ship canceled order" << std::endl;
}

void CanceledState::complete(Order& order) {
    std::cout << "Cannot complete canceled order" << std::endl;
}

int main() {
    Order order;
    order.ship();
    order.complete();
    order.cancel();
    order.ship();
    order.complete();

    return 0;
}


总结与分析

  • 状态模式适合需要频繁切换状态的系统设计。
  • 状态模式可以简化复杂的条件判断
  • 每个具体状态类只负责一个特定状态的行为使代码更易维护和拓展
  • 增加系统类和对象类的个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值