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

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

 

参看: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、调用

 

 1 void call_state()
 2 {
 3     // 1、创建上下文和状态AB
 4     std::unique_ptr<oct_context> pcontext(new(std::nothrow) oct_context);
 5     std::unique_ptr<oct_state> pstateA(newnew(std::nothrow) oct_state_A);
 6     std::unique_ptr<oct_state> pstateB(newnew(std::nothrow) oct_state_B);
 7 
 8     if (!pcontext || !pstateA || !pstateB)
 9     {
10         std::cout << "\n创建状态AB或者创建上下文对象失败\n";
11         return;
12     }
13 
14     // 1、进入状态A
15     std::cout << "\n1、进入状态A\n";
16     pstateB->do_action(pcontext.get());
17 
18     std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
19 
20     // 2、进入状态B
21     std::cout << "\n\n\n\n-----------------------------------\n2、进入状态B\n";
22     pstateB->do_action(pcontext.get());
23     std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
24 }

 

6、结果:

 

posted @ 2020-08-15 08:47  mohist  阅读(187)  评论(0编辑  收藏  举报