设计模式之(十二、状态模式State)

2011年4月1日 星期五 〖农历 辛卯 免年 二月廿八〗  晴

设计模式之(十二、状态模式State)
适用范围:
当一个对象的内存状态改变时允许改变其行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

以书中关于上班时间的工作状态为实例来介绍该模式。
状态模式结构图如下所示:
C++关键代码实现:
1、状态接口类IState
IState.h
class Work;//声明需要使用的类
virtual void WriteProram(Work *w) = 0;//虚函数

2、具体的状态类:上午状态类CForenoonState

CForenoonState.cpp
void CForenoonState::WriteProgram(Work *w)
{
 if(w->GetHour() < 12)
 {
  cout<<"现在时间是:"<<w->GetHour()<<"点,工作中,状态很好!"<<endl;
 }
 else
 {

  IState *s = new CNoonState();
  w->SetState(s);
  w->WriteProgram();

  if( s != NULL)

  {

     delete s;

  }
 }
}
3、中午状态类CNoonState

CNoonState.cpp
void CNoonState::WriteProgram(Work *w)
{
 if(w->GetHour() < 13 )
 {
  cout<<"现在时间是:"<<w->GetHour()<<"点,休息中!"<<endl;
 }
 else
 {

  IState *s = new CAfternoonState();
   w->SetState(s);
  w->WriteProgram();

  if (s != NULL)

  {

     delete s;

   }
 }
}
4、下午状态类CAfternoonState

CAfternoonState.cpp
void CAfternoonState::WriteProgram(Work *w)
{
 if(w->GetHour() < 17)
 {
  cout<<"现在时间是:"<<w->GetHour()<<"点,工作状态不错!"<<endl;
 }
 else
 {

  IState *s = new CEveningState();
  w->SetState(s);
  w->WriteProgram();

  if (s != NULL)

  {

     delete s;

  }
 }
}
5、傍晚状态类CEveningState


CEveningState.cpp
void CEveningState::WriteProgram(Work *w)
{
 if (w->GetRestFlag())
 {

  IState *s = new CRestState();
  w->SetState(s);
  w->WriteProgram();

  if (s != NULL)

  {

     delete s;

  }
 }
 else
 {
  if (w->GetHour()<21)
  {
   cout<<""<<w->GetHour()<<""<<endl;
  }
  else
  {

    IState *s = new CSleepState();
   w->SetState(s);
   w->WriteProgram();

   if(s != NULL)

   {

      delete s;

   }
  }
 }
}
6、休息状态类CRestState
CRestState.cpp
void CRestState::WriteProgram(Work *w)
{
   cout<<"现在时间是:"<<w->GetHour()<<"点,好累!"<<endl;
}

7、睡眠状态类CSleepState
CSleepState.cpp
void CSleepState::WriteProgram(Work *w)
{
   cout<<"现在时间是:"<<w->GetHour()<<"点,好困呀!"<<endl;
}

8、工作类Work
Work.cpp
Work::Work():m_state(NULL)
{

  }

Work::~Work()

{

}
//可以不用
void Work::SetState(IState *s)
{
   m_state = s;
}
void Work::SetHour(double d)
{
   m_hour = d;
}

double Work::GetHour()
{
   return m_hour;
}

void Work::SetRestFlag(bool falg)
{
    m_restflag = flag;
}

bool Work::GetRestFlag()
{
   return m_restflag;
}

void Work::WriteProgram()
{
  m_state->WriteProgram(this);
}

9、客户端实现main.cpp
Work *w = new Work();

IState *s = new CForenoonState();

w->SetState(s);
w->SetRestFlag(true);
w->SetHour(11);
w->WriteProgram();

 

w->SetHour(12.1);

w->SetState(s);
w->WriteProgram();

 

w->SetHour(15);

w->SetState(s);

w->WriteProgram();

 

w->SetHour(19);

w->SetState(s);
w->WriteProgram();

 

w->SetRestFlag(false);

w->SetHour(20);

w->SetState(s);
w->WriteProgram();

 

w->SetHour(22);

w->SetState(s);
w->WriteProgram();

 

if( w != NULL )

{

  delete w;

}

 

if(s != NULL)

{

   delete s;

}

 

以上,仅供参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值