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

            国产精品丝袜久久久久久不卡 | 久久久久久A亚洲欧洲AV冫| 婷婷久久综合九色综合98| 欧美激情精品久久久久久| 一本久久知道综合久久| 精品欧美一区二区三区久久久 | 久久久青草久久久青草| 手机看片久久高清国产日韩 | 亚洲国产高清精品线久久| 精品国产一区二区三区久久久狼 | 久久精品国产亚洲AV蜜臀色欲| 久久国产乱子精品免费女| 久久亚洲sm情趣捆绑调教| 国产无套内射久久久国产| 久久久久人妻一区二区三区vr| 久久久噜噜噜久久中文字幕色伊伊| 久久人人爽人人爽人人AV东京热| 久久人妻少妇嫩草AV蜜桃| 国产69精品久久久久99| 精品久久久久久久无码| 久久夜色精品国产欧美乱| 久久综合视频网| 久久涩综合| 久久精品成人免费观看97| 久久精品这里热有精品| 久久精品www人人爽人人| 无码人妻少妇久久中文字幕蜜桃| 久久天天躁狠狠躁夜夜av浪潮| 国产免费久久久久久无码| 91精品久久久久久无码| 99久久99久久精品国产片果冻| .精品久久久麻豆国产精品| 国产精品免费看久久久 | 国内精品久久久久影院老司| 久久精品国产一区二区三区不卡| 国产成人无码精品久久久免费| 久久精品视频网| 国产成人久久精品麻豆一区| 精品久久久无码中文字幕| 久久久久97国产精华液好用吗| 久久久久久久久久免免费精品|