• <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
            不錯,受益了  回復  更多評論
              

            精品久久久久久无码人妻蜜桃| 久久久久国产成人精品亚洲午夜| 亚洲va久久久噜噜噜久久男同| 久久精品九九亚洲精品| 久久精品国产第一区二区| 日韩av无码久久精品免费| 国产L精品国产亚洲区久久| 精品久久久久久久国产潘金莲| 精品久久久久久综合日本| 人妻无码αv中文字幕久久琪琪布| 成人妇女免费播放久久久| 久久中文字幕精品| 97超级碰碰碰碰久久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 国产精品日韩深夜福利久久| 97超级碰碰碰久久久久| 久久久亚洲裙底偷窥综合 | 亚洲人成无码久久电影网站| 精品久久8x国产免费观看| 久久99久国产麻精品66| 欧美成人免费观看久久| 精品久久久久久久久久久久久久久| 无码久久精品国产亚洲Av影片| 热99RE久久精品这里都是精品免费 | 人妻久久久一区二区三区| 色诱久久av| 久久国产香蕉一区精品| 久久91这里精品国产2020| 日本道色综合久久影院| 成人综合伊人五月婷久久| 久久国产亚洲高清观看| 国产亚洲精久久久久久无码| 精品熟女少妇a∨免费久久| 亚洲国产精品无码久久一线| 欧美丰满熟妇BBB久久久| 999久久久免费精品国产| 久久99国产精一区二区三区| 99久久精品九九亚洲精品| 久久久91人妻无码精品蜜桃HD | 性高湖久久久久久久久| 国内精品久久久久影院优 |