c++设计模式概述之状态
2021-04-02 06:27
标签: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、抽象状态 3、状态有多种,下面举例用到了2个A和B: 4、上下文(context) 5、调用 6、结果: c++设计模式概述之状态 标签:cout string 命中 font oct href div 不同 code 原文地址:https://www.cnblogs.com/pandamohist/p/13507481.html// 抽象状态
class oct_state
{
public:
virtual void do_action(oct_context *pct) = 0;
// 用于将上下文的状态输出
virtual std::string to_str() = 0;
protected:
std::string _str_state;
};
// 状态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; }
};
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;
};
void call_state()
{
// 1、创建上下文和状态AB
std::unique_ptr