青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

C++博客 首頁 新隨筆 聯系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
//直接貼代碼吧,歡迎提出缺點及改進方式
//StatePattern.h

#ifndef STATE_PATTERN_H
#define STATE_PATTERN_H

#include 
<iostream>
using namespace std;

typedef unsigned 
char BYTE;
class CScenario;//decl
class CSoldier
{
public:
    CSoldier();
    
~CSoldier(){};
    CScenario
* GetScenario();
    
void ChangeScenario(CScenario* scenario);
    
void HandleRequest(BYTE* req);//根據req請求決定采取的動作
protected:
    CScenario
* _scenario;
}
;

class CScenario//處于的場景
{
public:
    
enum ActionType
    
{
        AT_TELL_ON_ROAD    
= 0x01,
        AT_TELL_IN_RIVER   
= 0x02,
        AT_TELL_MEET_ENEMY 
= 0x04,
        AT_TELL_INFO       
= 0x07,//上面三個的"組合"

        AT_WALK               
= 0x08,
        AT_SWIM               
= 0x10,
        AT_FIRE               
= 0x20
    }
;
public:
    
virtual void ChangeScenario(CSoldier* soldier,CScenario* scenario){}
    
virtual int GetSupportedAction(){return 0;}
    
virtual void act(CSoldier*soldier, ActionType at){}//采取的動作
    virtual void Walk(){}//走路
    virtual void Swim(){}//游泳    
    virtual void Fire(){}//開槍
protected:
    CScenario()
{};
}
;

class CNoOp  : public CScenario
{
public:
    CNoOp()
{}
    
static CScenario* Instance();
    
void ChangeScenario(CSoldier* soldier,CScenario* scenario);
    
int GetSupportedAction();
    
void act(CSoldier*soldier,ActionType at);
private:
    
static CScenario* _instance;
}
;

class COnRoad : public CScenario
{
public:
    
static CScenario* Instance();
    
void ChangeScenario(CSoldier* soldier,CScenario* scenario);
    
void Walk();
    
int GetSupportedAction();
    
void act(CSoldier*soldier,ActionType at);
private:
    
static CScenario* _instance;
protected:
    COnRoad()
{};//禁止直接定義對象
}
;

class CInRiver : public CScenario
{
public:
    
static CScenario* Instance();
    
void ChangeScenario(CSoldier* soldier,CScenario* scenario);
    
void Swim();
    
int  GetSupportedAction();
    
void act(CSoldier*soldier,ActionType at);
private:
    
static CScenario* _instance;
protected:
    CInRiver()
{};
}
;

class CMeetEnemy : public CScenario
{
public:
    
static CScenario* Instance();
    
void ChangeScenario(CSoldier* soldier,CScenario* scenario);
    
void Fire();
    
int GetSupportedAction();
    
void act(CSoldier*soldier,ActionType at);
private:
    
static CScenario* _instance;
protected:
    CMeetEnemy()
{};
}
;
#endif

//StatePattern.cpp

#include 
"StatePattern.h"
CSoldier::CSoldier()
{
    
this->ChangeScenario(CNoOp::Instance());
}

CScenario
* CSoldier::GetScenario()
{
    
return _scenario;
}

void CSoldier::ChangeScenario(CScenario* scenario)
{
    
this->_scenario = scenario;
}

void CSoldier::HandleRequest(BYTE* req)
{
    
if (req == NULL)
    
{
        cout 
<< "req == NULL" << endl;
        
return;
    }

    BYTE action 
= *req;//一個字節的Action類型
    if (!(action & GetScenario()->GetSupportedAction()))//不支持該Action
    {
        cout 
<< "不支持該操作類型" << endl;
        
return;
    }

    GetScenario()
->act(this,(CScenario::ActionType)action);


    
return;
}


//0.實現CNoOp,作為soldier的初始化狀態
CScenario* CNoOp::_instance = NULL;
CScenario
* CNoOp::Instance()
{
    
if (_instance == NULL)
    
{
        _instance 
= new CNoOp();
    }

    
return _instance;
}

void CNoOp::ChangeScenario(CSoldier* soldier,CScenario* scenario)
{
    soldier
->ChangeScenario(scenario);
    
return;
}

int CNoOp::GetSupportedAction()
{
    
return AT_TELL_INFO;
}

void CNoOp::act(CSoldier*soldier,ActionType at)
{
    
switch(at)
    
{
    
case AT_TELL_ON_ROAD:
        cout 
<< "---> on road" << endl;
        soldier
->ChangeScenario(COnRoad::Instance());
        
break;
    
case AT_TELL_IN_RIVER:
        cout 
<< "---> in river" << endl;
        soldier
->ChangeScenario(CInRiver::Instance());
        
break;
    
case AT_TELL_MEET_ENEMY:
        cout 
<< "---> meet enymy" << endl;
        soldier
->ChangeScenario(CMeetEnemy::Instance());
        
break;
    
default:
        cout 
<< "unkown action type" << endl;
        
break;
    }

    
return;
}


//1.實現COnRoad
CScenario* COnRoad::_instance = NULL;
CScenario
* COnRoad::Instance()
{
    
if (_instance == NULL)
    
{
        _instance 
= new COnRoad();
    }

    
return _instance;
}

void COnRoad::Walk()
{
    cout 
<< "walk" << endl;
    
return;
}

int COnRoad::GetSupportedAction()
{
    
return AT_TELL_INFO | AT_WALK;
}

void COnRoad::ChangeScenario(CSoldier* soldier,CScenario* scenario)
{
    soldier
->ChangeScenario(scenario);
    
return;
}

void COnRoad::act(CSoldier*soldier,ActionType at)
{
    
switch(at)
    
{
    
case AT_TELL_ON_ROAD:
        cout 
<< "on road ---> on road" << endl;    
        
break;
    
case AT_TELL_IN_RIVER:
        cout 
<< "on road ---> in river" << endl;
        soldier
->ChangeScenario(CInRiver::Instance());
        
break;
    
case AT_TELL_MEET_ENEMY:
        cout 
<< "on road ---> meets enymy" << endl;
        soldier
->ChangeScenario(CMeetEnemy::Instance());
        
break;
    
case AT_WALK:
        cout 
<< "on road : walk now" << endl;
        
break;
    
default:
        cout 
<< "unkown action type" << endl;
        
break;
    }

    
return;
}


//2.實現CInRiver
CScenario* CInRiver::_instance = NULL;
CScenario
* CInRiver::Instance()
{
    
if (_instance == NULL)
    
{
        _instance 
= new CInRiver();
    }

    
return _instance;
}

void CInRiver::Swim()
{
    cout 
<< "swim" << endl;
    
return;
}

int CInRiver::GetSupportedAction()
{
    
return AT_TELL_INFO | AT_SWIM;
}

void CInRiver::ChangeScenario(CSoldier* soldier,CScenario* scenario)
{
    soldier
->ChangeScenario(scenario);
    
return;
}

void CInRiver::act(CSoldier*soldier,ActionType at)
{
    
switch(at)
    
{
    
case AT_TELL_ON_ROAD:
        cout 
<< "in river ---> on road" << endl;
        soldier
->ChangeScenario(COnRoad::Instance());
        
break;
    
case AT_TELL_IN_RIVER:
        cout 
<< "in river ---> in river" << endl;        
        
break;
    
case AT_TELL_MEET_ENEMY:
        cout 
<< "in river : meets enymy" << endl;
        soldier
->ChangeScenario(CMeetEnemy::Instance());
        
break;
    
case AT_SWIM:
        cout 
<< "in river : swim now" << endl;
        
break;
    
default:
        cout 
<< "unkown action type" << endl;
        
break;
    }

    
return;
}


//3.實現CMeetEnemy
CScenario* CMeetEnemy::_instance = NULL;
CScenario
* CMeetEnemy::Instance()
{
    
if (_instance == NULL)
    
{
        _instance 
= new CMeetEnemy();
    }

    
return _instance;
}

void CMeetEnemy::Fire()
{
    cout 
<< "fire" << endl;
    
return;
}

int CMeetEnemy::GetSupportedAction()
{
    
return AT_TELL_INFO | AT_FIRE;
}

void CMeetEnemy::ChangeScenario(CSoldier* soldier,CScenario* scenario)
{
    soldier
->ChangeScenario(scenario);
    
return;
}

void CMeetEnemy::act(CSoldier*soldier,ActionType at)
{
    
switch(at)
    
{
    
case AT_TELL_ON_ROAD:
        cout 
<< "meet enemy ---> on road" << endl;
        soldier
->ChangeScenario(COnRoad::Instance());
        
break;
    
case AT_TELL_IN_RIVER:
        cout 
<< "meet enemy ---> in river" << endl;        
        soldier
->ChangeScenario(CInRiver::Instance());
        
break;
    
case AT_TELL_MEET_ENEMY:
        cout 
<< "meet enemy ---> meet enymy" << endl;    
        
break;
    
case AT_FIRE:
        cout 
<< "meet enemy : fire now" << endl;
        
break;
    
default:
        cout 
<< "unkown action type" << endl;
        
break;
    }

    
return;
}

//StatePatternTest.cpp
// StateMachine.cpp : Defines the entry point for the console application.
//

#include 
<windows.h>
#include 
"StatePattern.h"

int main(int argc, char* argv[])
{
    typedef CScenario::ActionType ActionType;
    ActionType at;
    CSoldier soldier;

    
//0.在陸地上
    at = CScenario::AT_TELL_ON_ROAD;
    soldier.HandleRequest((BYTE
*)&at);

    
//1.陸地上行走
    at = CScenario::AT_WALK;
    soldier.HandleRequest((BYTE
*)&at);
    
    
//2.遇到敵人,狀態改變
    at = CScenario::AT_TELL_MEET_ENEMY;
    soldier.HandleRequest((BYTE
*)&at);

    
//3.遇到敵人后開火
    at = CScenario::AT_FIRE;
    soldier.HandleRequest((BYTE
*)&at);

    
//4.進入河中,狀態改變
    at = CScenario::AT_TELL_IN_RIVER;
    soldier.HandleRequest((BYTE
*)&at);

    
//5.河中游泳
    at = CScenario::AT_SWIM;
    soldier.HandleRequest((BYTE
*)&at);

    
//5.清理分配資源
    delete CNoOp::Instance();
    delete COnRoad::Instance();
    delete CInRiver::Instance();
    delete CMeetEnemy::Instance();

    system(
"pause");
    
return 0;
}


posted on 2008-05-26 12:46 true 閱讀(1571) 評論(1)  編輯 收藏 引用 所屬分類: Design Pattern

Feedback

# re: State模式的應用探討[未登錄] 2008-05-26 22:14 steven
不錯,受益了  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产三区| 亚洲国产精品精华液2区45| 久久久噜噜噜久久久| 亚洲精品资源| 欧美成人激情在线| 性欧美大战久久久久久久久| 亚洲第一二三四五区| 欧美三级欧美一级| 另类欧美日韩国产在线| 欧美一区二区三区另类| 亚洲一区免费| 亚洲国产精品va在线看黑人| 欧美诱惑福利视频| 亚洲一区二区成人在线观看| 亚洲激情第一区| 国产一区av在线| 国产精品视频xxx| 欧美久久久久免费| 能在线观看的日韩av| 性久久久久久久| 亚洲欧美日韩直播| 正在播放欧美一区| 艳妇臀荡乳欲伦亚洲一区| 亚洲国产精选| 亚洲国产小视频| 亚洲国产精品激情在线观看 | 欧美成人亚洲成人日韩成人| 欧美一区二区三区精品电影| 亚洲欧美国产另类| 亚洲系列中文字幕| 亚洲视频视频在线| 亚洲黄色尤物视频| 亚洲精品综合在线| 99国产精品久久久久久久成人热| 亚洲激情小视频| 亚洲激情不卡| 野花国产精品入口| 国产精品99久久久久久白浆小说| 99精品视频免费观看| 夜夜爽www精品| 亚洲精品在线三区| 一区二区三区欧美日韩| 久久av在线看| 毛片av中文字幕一区二区| 久久久免费精品| 欧美成人一区二免费视频软件| 免费亚洲一区| 亚洲国产婷婷香蕉久久久久久| 亚洲日本激情| 亚洲一区二区三区四区在线观看| 亚洲综合首页| 久久精品免视看| 欧美成人综合一区| 欧美剧在线观看| 国产精品伦理| 激情综合久久| 亚洲精品人人| 午夜视频在线观看一区二区三区 | 欧美激情按摩| 国产精品jizz在线观看美国| 国产精品欧美激情| 国产婷婷色一区二区三区在线| 激情综合五月天| 亚洲精选在线| 午夜久久久久久| 另类天堂av| 亚洲精品一区二区三| 亚洲宅男天堂在线观看无病毒| 午夜在线播放视频欧美| 久热精品视频在线| 欧美亚州韩日在线看免费版国语版| 国产精品日韩专区| 韩国成人精品a∨在线观看| 亚洲人成网站精品片在线观看| 亚洲一区二区三区四区五区午夜 | 国产精品成人一区二区网站软件| 国产精品国码视频| 国产喷白浆一区二区三区| 亚洲国产成人在线| 亚洲免费在线观看视频| 久久夜色精品国产欧美乱极品| 亚洲精品美女免费| 欧美一区二区视频免费观看| 欧美激情乱人伦| 国产一区二区三区久久悠悠色av | 亚洲剧情一区二区| 久久国产日韩| 国产精品va在线播放我和闺蜜| 国产精品香蕉在线观看| 亚洲电影视频在线| 欧美影院一区| 亚洲久久成人| 欧美不卡视频一区| 国产伦精品一区二区三区| 日韩视频在线观看免费| 久久午夜视频| 亚洲女性裸体视频| 欧美另类变人与禽xxxxx| 韩日欧美一区| 欧美一区成人| 亚洲精品在线视频观看| 另类天堂视频在线观看| 国产一区成人| 性色一区二区| 日韩视频一区二区三区在线播放免费观看 | 欧美成人精品h版在线观看| 亚洲亚洲精品三区日韩精品在线视频| 久久成人精品视频| 国产女人aaa级久久久级| 一区二区三区欧美在线| 欧美激情一区在线观看| 亚洲欧美制服中文字幕| 国产精品二区在线| 在线亚洲免费| 亚洲韩日在线| 毛片基地黄久久久久久天堂| 狠狠色丁香久久婷婷综合丁香 | 免费精品99久久国产综合精品| 午夜精品免费| 国产女优一区| 欧美中文在线观看| 亚洲一区二区三区成人在线视频精品 | 亚洲激情女人| 欧美激情按摩在线| 亚洲精品影院| 亚洲精品欧美日韩| 欧美成人午夜激情在线| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久久精品动漫| 欧美一区亚洲二区| 国产在线不卡精品| 久久亚洲国产成人| 久久视频这里只有精品| 伊人成人在线视频| 欧美国产视频在线观看| 亚洲自拍三区| 久久99在线观看| 久久99在线观看| 在线观看国产成人av片| 免费久久99精品国产| 老司机一区二区三区| 亚洲精品国产系列| 亚洲区一区二| 国产精品久久久久影院亚瑟| 午夜视频久久久| 久久www免费人成看片高清| 在线高清一区| 亚洲高清免费在线| 欧美四级剧情无删版影片| 亚洲综合三区| 欧美一区二区三区免费在线看| 狠狠色狠狠色综合| 亚洲成人自拍视频| 欧美日韩精品免费观看视频完整| 在线视频欧美日韩| 亚洲欧美日韩国产成人| 激情成人av| 最新国产拍偷乱拍精品| 国产精品进线69影院| 久久九九国产精品| 欧美大片在线观看| 午夜在线视频一区二区区别 | 欧美韩日视频| 亚洲欧美日韩人成在线播放| 香蕉成人伊视频在线观看| 亚洲电影av| 一区二区三区免费观看| 国产在线高清精品| 亚洲精品久久| 国产日韩欧美视频| 亚洲国产精品va在线看黑人 | 欧美日韩在线播放一区| 久久精品一二三| 欧美日韩不卡合集视频| 久久国产精品99精品国产| 欧美一区二区三区在线视频 | 亚洲第一中文字幕在线观看| 亚洲精品国产品国语在线app| 国产精品区一区二区三区| 免费黄网站欧美| 国产精品试看| 欧美大片一区二区| 国产精品视频免费观看www| 欧美xxx在线观看| 国产精品高潮在线| 免费观看国产成人| 国产精品视频导航| 亚洲高清一区二区三区| 国产一二精品视频| 一二三区精品福利视频| 亚洲电影免费观看高清完整版在线观看 | 久久亚洲精品伦理| 国产精品播放| 亚洲国产精彩中文乱码av在线播放| 国产精品chinese| 欧美国产激情| 狠狠狠色丁香婷婷综合久久五月| 一区二区三区四区五区在线| 亚洲经典在线看| 久久激情一区|