码迷,mamicode.com
首页 > 编程语言 > 详细

c++设计模式概述之状态

时间:2020-08-15 23:52:10      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:cout   string   命中   font   oct   href   div   不同   code   

代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做

 

参看:https://www.runoob.com/design-pattern/state-pattern.html

 

1、概述

  这个有点抽象,我的理解是: 行为受到状态的变化而变化。举一个例子,篮球员动员,如果运动员这会儿状态好,命中率(投球)就会上升。再比如人的情绪变化,可能会导致不同的行为。比如高兴,是动作A,犹豫,动作B。

  

  需要用的角色,主要分为2类,A、状态(state),B、上下文(context)。

 

2、抽象状态

// 抽象状态
class oct_state
{
public: 
    virtual void do_action(oct_context *pct) = 0;

    // 用于将上下文的状态输出
    virtual std::string to_str() = 0;

protected:
    std::string _str_state;
};

 

3、状态有多种,下面举例用到了2个A和B:

// 状态A
class oct_state_A : public oct_state
{
    // 实现接口
    void do_action(oct_context *pct)
    {
        // 1、输出当前发状态
        std::cout << "\n状态变化了,现在正处于状态A\n";

        // 2、告诉上下文,已经进入了状态A
        if (pct)
            pct->set_state(this);

        _str_state = std::string("状态A");
    }

    std::string to_str() { return _str_state; }


};

// 状态B 
class oct_state_B : public oct_state
{
    void do_action(oct_context *pct)
    {
        // 1、输出当前发状态
        std::cout << "\n状态变化了,现在正处于状态B\n";

        // 2、告知上下文,进入了状态B
        if (pct)
            pct->set_state(this);
        
        _str_state = std::string("状态B");
    }

    std::string to_str() { return _str_state; }
};

 

4、上下文(context)

class oct_context
{
public:
    void set_state(oct_state *ps)
    {
        if (ps)
            _pstate = ps;
    }

    oct_state * get_state() { return _pstate; }

private:
    oct_state    *_pstate = nullptr;
};

 

5、调用

void call_state()
{
    // 1、创建上下文和状态AB
    std::unique_ptr<oct_context> pcontext(new oct_context);
    std::unique_ptr<oct_state> pstateA(new oct_state_A);
    std::unique_ptr<oct_state> pstateB(new oct_state_B);

    if (!pcontext || !pstateA || !pstateB)
    {
        std::cout << "\n创建状态AB或者创建上下文对象失败\n";
        return;
    }

    // 1、进入状态A
    std::cout << "\n1、进入状态A\n";
    pstateB->do_action(pcontext.get());

    std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;

    // 2、进入状态B
    std::cout << "\n\n\n\n-----------------------------------\n2、进入状态B\n";
    pstateB->do_action(pcontext.get());
    std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;

}

 

6、结果:

技术图片

 

c++设计模式概述之状态

标签:cout   string   命中   font   oct   href   div   不同   code   

原文地址:https://www.cnblogs.com/pandamohist/p/13507481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!