• <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 閱讀(1556) 評論(1)  編輯 收藏 引用 所屬分類: Design Pattern

            Feedback

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

            国产成人精品白浆久久69| 久久亚洲国产精品一区二区| 国产精品久久久久无码av| 亚洲AV日韩AV天堂久久| 久久香综合精品久久伊人| 日本免费久久久久久久网站| 久久精品国产99国产精品| 久久精品中文字幕大胸| 久久精品蜜芽亚洲国产AV| 丁香五月综合久久激情| 久久久久免费精品国产| 狠狠色丁香久久婷婷综合五月 | 久久91精品综合国产首页| 亚洲国产精品综合久久一线| 97久久国产露脸精品国产| 久久香蕉国产线看观看99| 久久久亚洲欧洲日产国码是AV| 久久免费国产精品一区二区| 久久成人小视频| 久久国产精品波多野结衣AV| 精品无码久久久久国产| 麻豆av久久av盛宴av| 国产高潮国产高潮久久久91 | 中文字幕精品无码久久久久久3D日动漫 | 亚洲精品无码久久不卡| 国产午夜久久影院| 色欲综合久久中文字幕网| 亚洲欧洲久久久精品| 91性高湖久久久久| 久久久久成人精品无码中文字幕| 中文字幕无码久久久| 四虎久久影院| 久久久久一本毛久久久| 国产成人精品久久| 91精品国产色综久久| 久久―日本道色综合久久| 久久精品国产亚洲av影院| 中文字幕人妻色偷偷久久| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久久久久a亚洲欧洲aⅴ| 国产精品99久久99久久久|