• <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>

            網絡服務器軟件開發/中間件開發,關注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 閱讀(1560) 評論(1)  編輯 收藏 引用 所屬分類: Design Pattern

            Feedback

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

            噜噜噜色噜噜噜久久| 久久精品三级视频| 国产成人久久精品一区二区三区| 久久精品欧美日韩精品| 国产亚洲精久久久久久无码| 国产精品免费久久久久电影网| 免费久久人人爽人人爽av| 久久青青草原精品国产不卡| 久久天天躁狠狠躁夜夜avapp| 久久人人爽人人爽AV片| 久久九九亚洲精品| 久久精品国产久精国产果冻传媒| 9久久9久久精品| 亚洲欧美伊人久久综合一区二区| 国产精品成人99久久久久91gav| 伊人久久国产免费观看视频| 91久久成人免费| 美女写真久久影院| 无码专区久久综合久中文字幕 | 久久久久久精品免费看SSS| 粉嫩小泬无遮挡久久久久久| 2021国产精品午夜久久| 欧洲国产伦久久久久久久| 国产精品内射久久久久欢欢| 久久精品成人免费网站| 人妻无码αv中文字幕久久 | 亚洲欧洲中文日韩久久AV乱码| 久久精品aⅴ无码中文字字幕不卡| 国产精品一区二区久久精品| 少妇久久久久久被弄高潮| 亚洲国产欧洲综合997久久| 欧美久久天天综合香蕉伊| 婷婷综合久久狠狠色99h| 97久久精品人妻人人搡人人玩| 久久婷婷五月综合97色| 亚洲乱码精品久久久久..| 伊人久久大香线焦AV综合影院| 亚洲精品乱码久久久久久蜜桃图片| 亚洲精品无码久久久久sm| 99久久99这里只有免费的精品| 狠狠色丁香婷综合久久|