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

            菜菜成長日記

            勤奮,踏實,在生活中學習,在學習中快樂……
            posts - 4, comments - 2, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            C++實現策略(Strategy)模式

            Posted on 2008-04-28 19:09 程誠成 閱讀(513) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式(DesignPatten)

                策略(Strategy)模式,是比較簡單的一種設計模式,但它的應用卻隨處可見。下面模擬游戲中常用的打斗場面,來理解策略模式。在游戲中,通常有n個角色,每個角色都能發出動作:fight。每個角色都使用不同的武器,并且可以更換武器。下面是此場景簡化的C++實現:

                Strategy.h

            #ifndef _STRETEGY_H_
            #define _STRETEGY_H_

            //定義武器接口
            class WeaponBehavior
            {
            public:
                
            void virtual useWeapon() = 0;
            }
            ;

            class Sword:public WeaponBehavior
            {
            public:
                
            void useWeapon();
            }
            ;

            class Axe:public WeaponBehavior
            {
            public:
                
            void useWeapon();
            }
            ;

            class Arrow:public WeaponBehavior
            {
            public:
                
            void useWeapon();
            }
            ;

            class Knife:public WeaponBehavior
            {
            public:
                
            void useWeapon();
            }
            ;

            //定義角色接口
            class Character
            {
            public:
                Character()
                
            {
                    weapon 
            = 0;
                }

                
            void setWeapon(WeaponBehavior *w)
                
            {
                    
            this->weapon = w;
                }

                
            void virtual fight() = 0;
            protected:
                WeaponBehavior 
            *weapon;
            }
            ;

            class King:public Character
            {
            public:
                
            void fight();
            }
            ;

            class Queen:public Character
            {
            public:
                
            void fight();
            }
            ;

            class Knight:public Character
            {
            public:
                
            void fight();
            }
            ;

            class Troll:public Character
            {
            public:
                
            void fight();
            }
            ;


            #endif

            說明:
                1.因為每個武器的使用方式不同,所以將使用武器的行為封裝成接口,利用此接口調用具體武器的useWeapon行為。
                2.因為每個角色都有打斗,更換武器的行為,各個角色的打斗行為不同,而更換武器的行為相同,所以將setWeapon在Character中實現,而打斗行為在各個具體的角色中實現。

            Strategy.cpp
            #include <iostream>
            #include 
            "Strategy.h"
            using namespace std;
            void Sword::useWeapon()
            {
                cout 
            << "Use Sword to stuck!" << endl;
            }


            void Axe::useWeapon()
            {
                cout 
            << "Use Axe to chop!" << endl;
            }


            void Knife::useWeapon()
            {
                cout 
            << "Use Knife to kill!" << endl;
            }


            void Arrow::useWeapon()
            {
                cout 
            << "Use arrow!" << endl;
            }


            void King::fight()
            {
                cout 
            << "The king:" ;
                
            if ( this->weapon == NULL)
                
            {
                    cout 
            << "You don't have a weapon! Please Set Weapon!" << endl;
                }

                
            else
                

                    weapon
            ->useWeapon();
                }

            }


            void Queen::fight()
            {
                cout 
            << "The Queen:" ;
                
            if ( this->weapon == NULL)
                
            {
                    cout 
            << "You don't have a weapon! Please Set Weapon!" << endl;
                }

                
            else
                
            {  
                    weapon
            ->useWeapon();
                }

            }


            void Knight::fight()
            {
                cout 
            << "The Knight:" ;
                
            if ( this->weapon == NULL)
                
            {
                    cout 
            << "You don't have a weapon! Please Set Weapon!" << endl;
                }

                
            else
                
            {  
                    weapon
            ->useWeapon();
                }

            }


            void Troll::fight()
            {
                cout 
            << "The Troll:";
                
            if ( this->weapon == NULL)
                
            {
                    cout 
            << "You don't have a weapon! Please Set Weapon!" << endl;
                }

                
            else
                
            {  
                    weapon
            ->useWeapon();
                }

            }


            main.cpp
            #include <iostream>
            #include 
            "Strategy.h"
            using namespace std;
            int main()
            {
                
            //聲明武器
                WeaponBehavior *sw = new Sword();//聲明劍
                WeaponBehavior *axe = new Axe();//聲明斧頭
                WeaponBehavior *arr = new Arrow();//聲明弓箭
                WeaponBehavior *kn = new Knife();//聲明刀
                
                
            //聲明角色
                Character *kin = new King();
                Character 
            *qu = new Queen();
                Character 
            *kni = new Knight();
                Character 
            *tr = new Troll();
                
                
            //調用打斗行為
                kin->fight();
                qu
            ->fight();
                kni
            ->fight();
                tr
            ->fight();
                cout 
            << endl;

                
            //更換武器
                kin->setWeapon(sw);
                kin
            ->fight();
                cout 
            << endl;

                kin
            ->setWeapon(arr);
                kin
            ->fight();

                
            return 0;
            }


            策略(Strategy)模式體現了2個重要的面向對象設計原則:
                1.封裝變化。
                2.針對接口編程。

            參考資料:深入淺出設計模式第一章1  深入淺出設計模式第一章2
            久久综合综合久久综合| 久久精品一本到99热免费| 狠色狠色狠狠色综合久久| 国产精品久久久久久一区二区三区| 久久久久久亚洲Av无码精品专口| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 欧美国产精品久久高清| 久久艹国产| 亚洲女久久久噜噜噜熟女| 国产精品久久波多野结衣| 国内精品久久久久久中文字幕| 亚洲一区二区三区日本久久九| 香蕉99久久国产综合精品宅男自| 久久综合给合久久狠狠狠97色69| 7国产欧美日韩综合天堂中文久久久久| 国内精品久久久久久久久电影网 | 久久亚洲日韩精品一区二区三区| 国产精久久一区二区三区| 久久强奷乱码老熟女网站| 天天爽天天爽天天片a久久网| 久久精品中文无码资源站| 精品熟女少妇aⅴ免费久久| AAA级久久久精品无码片| 久久久久久久精品成人热色戒| 精品久久久久久久中文字幕 | 久久精品国产亚洲Aⅴ蜜臀色欲| 久久精品极品盛宴观看| 久久成人精品| 国产精品99久久久久久董美香| 亚洲中文字幕无码久久2017| 亚洲国产日韩欧美久久| 国产精品欧美久久久久无广告| 久久久久亚洲av无码专区导航 | 亚洲国产视频久久| 久久综合综合久久狠狠狠97色88| 久久精品国产亚洲AV无码麻豆| 久久天天躁狠狠躁夜夜2020一| 久久乐国产综合亚洲精品| 亚洲性久久久影院| 国产精品久久久久久五月尺| 亚洲欧美另类日本久久国产真实乱对白|