状态模式
(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
在这里极力推荐一部电影《肖申克的救赎》,下面用状态模式来实现男主的经历:
剧情简单介绍(百度的):
《肖申克的救赎》的故事发生在1947年,银行家安迪(Andy)被指控枪杀了妻子及其情人,安迪被判无期徒刑,这意味着他将在肖申克监狱中渡过余生。男主安迪是1948年到的肖申克,1967年挖好的洞,但他一直到1975年才越狱。所以他在监狱中一共关了27年。
#include<iostream>
#include<list>
#include<string>
using namespace std;
class Andy;//男主
class State//状态
{
public:
string m_satedes;//描述当前的状态
public:
virtual void Fbegin(){};//前期状态
virtual void Fmid(){};//中期状态
virtual void Fend(){};//末期状态
virtual void CurrentState(Andy*p_andy){};//调用当前状态,统一的接口,然后各个状态子类去调用自己的函数
};
class Andy
{
private:
State *m_state; //目前状态
int m_years; //时间
public:
Andy(State *state): m_state(state), m_years(0) {}
~Andy() { delete m_state; }
int GetYears() { return m_years; }
void SetYears(int years) { m_years = years; }
void SetState(State *state) { delete m_state; m_state = state; }
void GetState() { m_state->CurrentState(this); }
};
//服刑末期
class State_End:public State
{
public:
State_End()
{
m_satedes = "挖洞逃出来了";
}
void FEnd(Andy *p_andy)
{
cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
}
void CurrentState(Andy *p_andy)
{
FEnd(p_andy);
}
};
//服刑中期
class State_Mid:public State
{
public:
State_Mid()
{
m_satedes = "服刑中期,每天帮监狱长做假账,顺便开始夜里挖洞";
}
void FMid(Andy *p_andy)
{
if(p_andy->GetYears()<28)
{
cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
}
else
{
p_andy->SetState(new State_End());
p_andy->GetState();
}
}
void CurrentState(Andy *p_andy)
{
FMid(p_andy);
}
};
//服刑前期
class State_begin:public State
{
public:
State_begin()
{
m_satedes = "男主Andy刚进监狱,处处受人欺负";
}
void Fbegin(Andy *p_andy)
{
if(p_andy->GetYears()<5)
{
cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
}
else
{
p_andy->SetState(new State_Mid());
p_andy->GetState();
}
}
void CurrentState(Andy *p_andy)
{
Fbegin(p_andy);
}
};
int main()
{
Andy *p = new Andy(new (State_begin));
for(int i = 1; i < 40; ++i)
{
p->SetYears(i);
p->GetState();
}
delete p;
return 0;
}