#include <cstdlib>
#include <iostream>
using namespace std;
class Baby;
class State
{
protected:
int m_Value;
public:
State(int n):m_Value(n){}
virtual ~State(){cout<<"State 基类析构"<<endl;}
virtual void HaveATalk(Baby* pCon,int n) = 0;
virtual void MakeFood() = 0;
void ChangeState(Baby* pCon,State* p);
};
class Angry:public State
{
public:
Angry(int n):State(n){}
virtual ~Angry(){cout<<"Angry 类析构"<<endl;}
void HaveATalk(Baby* pCon,int n);
virtual void MakeFood();
};
class Happy:public State
{
public:
Happy(int n):State(n){}
virtual ~Happy(){cout<<"Happy 类析构"<<endl;}
void HaveATalk(Baby* pCon,int n);
virtual void MakeFood();
};
class Baby
{
State* pState;
State* pOldState;
public:
friend class State;
Baby(){pState = new Happy(0);}
virtual ~Baby(){
cout<<"wch 类析构"<<endl;
if(pOldState != NULL){delete pOldState;}
if(pState != NULL){delete pState;}
}
void MakeFood(int n){
cout<<"我叫 wch!给我状态 : "<<n<<endl;
pState->HaveATalk(this,n);
pState->MakeFood();
}
private:
void ChangeState(State* p){
if(pOldState != NULL){//上一次状态要在这一次改变时删除
delete pOldState;
pOldState = NULL;
}
pOldState = pState;//这一次的状态变成了上一次的状态,也就是这次先不删
pState = p;//更新了状态
}
};
void State::ChangeState(Baby* pCon,State* p)
{
pCon->ChangeState(p);
}
void Angry::HaveATalk(Baby* pCon,int n)
{
if(n >= 0){//改变为高兴状态
ChangeState(pCon,new Happy(n));
}
}
void Angry::MakeFood()
{
for(int i = m_Value; i < 0; i++ ){
cout<<"摔1个盘"<<endl;
}
cout<<"让我生气,就让你吃这个!哼哼哼"<<endl;
}
void Happy::HaveATalk(Baby* pCon,int n)
{
if(n < 0){//改变为生气状态
ChangeState(pCon,new Angry(n));
}
}
void Happy::MakeFood()
{
for(int i = 0; i < m_Value; i++ ){
cout<<"做一个菜"<<endl;
}
cout<<"对我这么好,给亲爱的做好吃的!嗯~~~~~~~~~"<<endl;
}
void PeopleLife(Baby* pwch)
{
cout<<"-------------------------"<<endl;
pwch->MakeFood(-2);
cout<<"-------------------------"<<endl;
pwch->MakeFood(2);
cout<<"-------------------------"<<endl;
pwch->MakeFood(-2);
cout<<"-------------------------"<<endl;
delete pwch;
}
int main(int argc, char *argv[])
{
PeopleLife(new Baby);
system("PAUSE");
return EXIT_SUCCESS;
}