设计模式之state模式(一)

 

// 详细代码请从我的资源中下载

// 状态模式主要用来解决的是当控制一个对象转换的条件表达式过于复杂时的情况。
// 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
// 当然,如果这个状态判断很简单,那就没有变要使用“状态模式”了。

 参照程杰的大话设计模式 写出 C++代码的 状态模式

 


// 无尽加班何时休 --- 状态模式 state Design Patterns
// author: wangjinfeng

// 每天12点之前, 上午工作,精神百倍
// 12点到13点, 饿了,午饭,犯困,午休
// 13点到17点, 状态不错,继续努力
// 到17点之后,如果工作做完了,就下班回家了,


 

//  State.h

#pragma once

class CWork;
class  CState
{
public:
 virtual void  WriteProgram( CWork *w)
 {}
};

 

// work.h

#pragma once

#include "ForenoonState.h"
class CWork
{
public:
 CWork();

 int Hour;
 bool bIsWorkFinshed;
 CState *m_state;
 void SetState(CState *s);

 void Write();


};

 

// work.cpp

#include "stdafx.h"
#include "Work.h"

CWork::CWork()
{
 CForenoonState *Aa = new CForenoonState() ;
 m_state = Aa;
}

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

void CWork::SetState(CState *s)
{
 m_state = s;
}

// ForenoonState.h

pragma once
#include "State.h"
#include "Work.h"
class CForenoonState :public CState
{
public:
 virtual void WriteProgram(CWork *w);
};

 

// ForenoonState.cpp

#include "stdafx.h"
#include "ForenoonState.h"
#include "NoonState.h"
#include <iostream>
using namespace std;

void CForenoonState::WriteProgram(CWork *w)
{

  if (w->Hour < 12)
  {
   cout << "当前时间:" << w->Hour << "点"<<"上午工作,精神百倍"  << endl;
  }
  else
  {
   CNoonState *pCNoSta = new CNoonState();
   w->SetState(  pCNoSta);
   w->Write();
  }
 
}

 

// NoonState.h

#include "stdafx.h"
#include "State.h"

class CNoonState:public CState
{
public:
 virtual void WriteProgram(CWork *w);
};

// NoonState.cpp

#include "stdafx.h"
#include "NoonState.h"
#include "AfternoonState.h"
#include <iostream>
#include "Work.h"
using namespace std;
void CNoonState::WriteProgram(CWork *w)
{
 if (w->Hour <13)
 {
  cout << "当前时间:" << w->Hour<< "点" << "饿了,午饭,犯困,午休" <<endl;
 }
 else
 {
  // CAfternoonState *pCAfterNoon = new CAfternoonState();
  // w->SetState(pCAfterNoon);
  // w->Write();
 }
}

 

 

// 在客户端实现

int _tmain(int argc, _TCHAR* argv[])
{
 CWork cA;
 cA.Hour = 9;
 cA.Write();
 cA.Hour =12;
 cA.Write();
 //cA.Hour =15;
// cA.Write();
 //cA.Hour =18;
 //cA.Write();
 //cA.Hour =23;
 //cA.Write();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值