State 模式

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值