标签: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、结果:
标签:cout string 命中 font oct href div 不同 code
原文地址:https://www.cnblogs.com/pandamohist/p/13507481.html