栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++状态模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++状态模式

 

#include 
#include 
#include 

// 上下文类和状态类两者相互引用

// 上下文类
class Context;


// 状态基类接口
class State
{
protected:
    Context *context_;  // 反向引用

public:
    virtual ~State() {}

    // 给状态设置上下文
    void SetContext(Context *context)
    {
        this->context_ = context;
    }

    // 不同上下文对应的不同事件,也就是当前不同的状态,对应不同的行为
    // 当有新的状态行为的时候,只需要增加新的Handle,并在子类里重写即可
    virtual void Handle1() = 0;
    virtual void Handle2() = 0;
};

// 上下文类
class Context
{
private:
    State *state_;  // 表示状态,状态和上下文状态对应

public:

    // 设置当前的状态,这里的参数应是State的子类:具体的A状态或B状态
    Context(State *state) : state_(nullptr)
    {
        this->TransitionTo(state);  // 设置状态
    }

    ~Context()
    {
        delete state_;
    }

    // 设置状态
    void TransitionTo(State *state)
    {
        std::cout << "Context: Transition to " << typeid(*state).name() << std::endl;
        
        // 如果有旧的状态,先释放掉旧的状态
        if (this->state_ != nullptr)
        {
            delete this->state_;
        }

        // 设置新的状态
        this->state_ = state;

        // 将新的状态的上下文设置成当前上下文
        // 必须要设置,不然在释放旧状态的时候就会释放空内存
        // 必须相互引用,相互设置
        this->state_->SetContext(this);
    }

    // 对状态的应答
    void Request1()
    {
        this->state_->Handle1();
    }

    void Request2()
    {
        this->state_->Handle2();
    }
};

// 将状态 变成 真实的类
class ConcreteStateB;

class ConcreteStateA : public State
{
public:
    void Handle1() override;

    void Handle2() override
    {
        std::cout << "ConcreteState A handles request2" << std::endl;
    }
};

class ConcreteStateB : public State
{
public:
    void Handle1() override
    {
        std::cout << "ConcreteStateB handles request2" << std::endl;
    }

    void Handle2() override
    {
        std::cout << "ConcreteStateB handles request2" << std::endl;
        std::cout << "ConcreteStateB wangs to change the state of the context." << std::endl;
        this->context_->TransitionTo(new ConcreteStateA);
    }
};

void ConcreteStateA::Handle1()
{
    std::cout << "ConcreteState A handles request1" << std::endl;
    std::cout << "ConcreteState A wants to change the state of the context." << std::endl;

    // 设置成状态B,函数内部自动析构掉状态A
    this->context_->TransitionTo(new ConcreteStateB);
}

int main()
{
    // 新建一个环境,是状态A
    Context *context = new Context(new ConcreteStateA);
    context->Request1();
    // context->Request1();
    context->Request2();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号