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

網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  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);//根據(jù)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;//一個字節(jié)的Action類型
    if (!(action & GetScenario()->GetSupportedAction()))//不支持該Action
    {
        cout 
<< "不支持該操作類型" << endl;
        
return;
    }

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


    
return;
}


//0.實現(xiàn)CNoOp,作為soldier的初始化狀態(tài)
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.實現(xiàn)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.實現(xiàn)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.實現(xiàn)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.遇到敵人,狀態(tài)改變
    at = CScenario::AT_TELL_MEET_ENEMY;
    soldier.HandleRequest((BYTE
*)&at);

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

    
//4.進入河中,狀態(tài)改變
    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 閱讀(1568) 評論(1)  編輯 收藏 引用 所屬分類: Design Pattern

Feedback

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            国色天香一区二区| 亚洲精品一级| 欧美在线视频一区二区| 日韩午夜av电影| 欧美日韩一二三区| 午夜视频在线观看一区二区| 性欧美18~19sex高清播放| 国模吧视频一区| 欧美国产精品久久| 国产精品第13页| 免费短视频成人日韩| 欧美精品一区二区三区很污很色的 | 国产欧美日韩综合一区在线播放 | 欧美日韩免费观看一区三区| 久久电影一区| 欧美久久婷婷综合色| 久久久久久亚洲精品中文字幕 | 久久夜色精品国产| 欧美日韩三级在线| 久久一区二区视频| 国产精品成人av性教育| 久久综合色一综合色88| 欧美色综合网| 亚洲国产精品毛片| 国产亚洲日本欧美韩国| 久久在线91| 欧美伦理91i| 亚洲一本大道在线| 久久久91精品国产一区二区三区| 一区在线播放| 久久综合久久综合九色| 国产精品永久| 久久国产主播精品| 久久久久99| 欧美人交a欧美精品| 欧美成人免费在线观看| 欧美理论在线播放| 校园激情久久| 久久人体大胆视频| 夜夜狂射影院欧美极品| 欧美成人首页| 亚洲欧美在线网| 久久av资源网| 在线观看欧美亚洲| 午夜精品福利一区二区三区av| 久热精品视频在线| 正在播放亚洲一区| 午夜精彩视频在线观看不卡 | 亚洲精品国产品国语在线app| 最近看过的日韩成人| 欧美日韩第一区日日骚| 国产九九视频一区二区三区| 一本综合精品| 韩国精品久久久999| 91久久精品一区二区别| 国产精品国产三级国产| 国产视频精品网| 午夜欧美理论片| 亚洲国产视频一区| 亚洲先锋成人| 亚洲麻豆av| 亚洲第一中文字幕| 亚洲精品欧美精品| 欧美一级久久| 夜夜精品视频| 久久一二三四| 精品动漫3d一区二区三区免费版| 久久精品一二三区| 午夜精品久久久久久久| 六月丁香综合| 性亚洲最疯狂xxxx高清| 男同欧美伦乱| 亚洲第一页自拍| 午夜精品久久一牛影视| 亚洲精选久久| 欧美亚洲日本网站| 国产亚洲精品久久飘花| 久久久久久久国产| 亚洲欧美日韩中文视频| 欧美大片在线看| 久久米奇亚洲| 国产精品久久久久久av福利软件| 午夜精品福利电影| 亚洲一区日韩在线| 欧美三日本三级三级在线播放| 亚洲福利精品| 国产精品不卡在线| 欧美在线影院| 久久九九久精品国产免费直播| 欧美视频亚洲视频| 洋洋av久久久久久久一区| 国产人成一区二区三区影院| 欧美成人日韩| 亚洲激情欧美激情| 亚洲精品欧美极品| 美女任你摸久久| 亚洲欧美国产毛片在线| 亚洲综合日韩中文字幕v在线| 欧美日韩1234| 一区二区三区回区在观看免费视频| 国产精品久久久999| 久久九九久精品国产免费直播| 久久香蕉国产线看观看av| 国产精品综合av一区二区国产馆| 一区二区三区视频观看| 亚洲视频电影图片偷拍一区| 欧美日精品一区视频| av成人免费| 亚洲欧美另类久久久精品2019| 国语自产精品视频在线看抢先版结局| 欧美一区二区三区喷汁尤物| 久久精品欧美日韩| 国产一区二区三区直播精品电影| 亚洲精品久久久久久一区二区| 久久性色av| 91久久精品一区二区三区| 欧美成人在线免费观看| 亚洲精品久久久久久下一站| 尤物九九久久国产精品的特点| 欧美日在线观看| 午夜在线一区二区| 免播放器亚洲一区| 亚洲免费成人av电影| 亚洲一区二区在线免费观看| 久久久久久尹人网香蕉| 在线看成人片| 欧美精品黄色| 亚洲午夜精品久久| 一区二区av在线| 久久精品一本| 亚洲精品中文字幕有码专区| 欧美日韩一区在线播放| 欧美肥婆bbw| 久热精品视频| 一本色道精品久久一区二区三区| 国产精品激情偷乱一区二区∴| 欧美在线亚洲综合一区| 久久综合网络一区二区| 一区二区欧美在线| 国产一区在线视频| 一区二区三区**美女毛片| 午夜免费日韩视频| 亚洲欧美制服中文字幕| 亚洲高清电影| 国产精品国产三级国产| 久久伊人精品天天| 欧美肥婆在线| 亚洲人成毛片在线播放女女| 久久久久国产一区二区| 夜夜爽夜夜爽精品视频| 国内视频一区| 久久米奇亚洲| 欧美一区二区啪啪| 亚洲日本成人| 免费观看一级特黄欧美大片| 亚洲第一精品夜夜躁人人爽| 亚洲三级影院| 在线不卡免费欧美| 国产精品亚洲第一区在线暖暖韩国| 久久精品视频在线播放| 久久一区二区三区国产精品| 亚洲午夜性刺激影院| 亚洲国产欧美不卡在线观看| 欧美在线欧美在线| 亚洲国产美女精品久久久久∴| 亚洲精品在线观看免费| 国产主播一区| 国产区欧美区日韩区| 国产精品二区影院| 伊人久久综合| 狠狠色丁香婷婷综合影院| 国产精品久久国产精品99gif| 欧美a级在线| 国产亚洲欧美另类中文| 91久久国产综合久久91精品网站| 国产三区二区一区久久| 国产精品www.| 欧美成人免费网| 国产精品久久午夜夜伦鲁鲁| 欧美另类高清视频在线| 欧美成人免费va影院高清| 久久久国产91| 欧美日韩一区二区在线观看| 欧美高清视频一区二区| 久久久久青草大香线综合精品| 欧美亚洲综合网| 亚洲福利视频网站| 亚洲一区二区三区在线| 最新高清无码专区| 亚洲激情视频网| 亚洲国产专区| 久久久999国产| 久久综合久久88| 免费看av成人| 免费看的黄色欧美网站| 国产日韩欧美电影在线观看| 国产精品一区在线观看你懂的| 国产精品日韩欧美一区| 欧美系列亚洲系列| 亚洲国产另类久久久精品极度 |