C++实现策略(Strategy)模式
策略(Strategy)模式,是比较简单的一种设计模式,但它的应用却随处可见。下面模拟游戏中常用的打斗场面,来理解策略模式。在游戏中,通常有n个角色,每个角色都能发出动作:fight。每个角色都使用不同的武器,并且可以更换武器。下面是此场景简化的C++实现:
    Strategy.h
 #ifndef _STRETEGY_H_
#ifndef _STRETEGY_H_ #define _STRETEGY_H_
#define _STRETEGY_H_
 //定义武器接口
//定义武器接口 class WeaponBehavior
class WeaponBehavior {
{ public:
public: void virtual useWeapon() = 0;
    void virtual useWeapon() = 0; };
};
 class Sword:public WeaponBehavior
class Sword:public WeaponBehavior {
{ public:
public: void useWeapon();
    void useWeapon(); };
};
 class Axe:public WeaponBehavior
class Axe:public WeaponBehavior {
{ public:
public: void useWeapon();
    void useWeapon(); };
};
 class Arrow:public WeaponBehavior
class Arrow:public WeaponBehavior {
{ public:
public: void useWeapon();
    void useWeapon(); };
};
 class Knife:public WeaponBehavior
class Knife:public WeaponBehavior {
{ public:
public: void useWeapon();
    void useWeapon(); };
};
 //定义角色接口
//定义角色接口 class Character
class Character {
{ public:
public: Character()
    Character() {
    { weapon = 0;
        weapon = 0; }
    } void setWeapon(WeaponBehavior *w)
    void setWeapon(WeaponBehavior *w) {
    { this->weapon = w;
        this->weapon = w; }
    } void virtual fight() = 0;
    void virtual fight() = 0; protected:
protected: WeaponBehavior *weapon;
    WeaponBehavior *weapon; };
};
 class King:public Character
class King:public Character {
{ public:
public: void fight();
    void fight(); };
};
 class Queen:public Character
class Queen:public Character {
{ public:
public: void fight();
    void fight(); };
};
 class Knight:public Character
class Knight:public Character {
{ public:
public: void fight();
    void fight(); };
};
 class Troll:public Character
class Troll:public Character {
{ public:
public: void fight();
    void fight(); };
};

 #endif
#endif
说明:
    1.因为每个武器的使用方式不同,所以将使用武器的行为封装成接口,利用此接口调用具体武器的useWeapon行为。
    2.因为每个角色都有打斗,更换武器的行为,各个角色的打斗行为不同,而更换武器的行为相同,所以将setWeapon在Character中实现,而打斗行为在各个具体的角色中实现。
Strategy.cpp
 #include <iostream>
#include <iostream> #include "Strategy.h"
#include "Strategy.h" using namespace std;
using namespace std; void Sword::useWeapon()
void Sword::useWeapon() {
{ cout << "Use Sword to stuck!" << endl;
    cout << "Use Sword to stuck!" << endl; }
}
 void Axe::useWeapon()
void Axe::useWeapon() {
{ cout << "Use Axe to chop!" << endl;
    cout << "Use Axe to chop!" << endl; }
}
 void Knife::useWeapon()
void Knife::useWeapon() {
{ cout << "Use Knife to kill!" << endl;
    cout << "Use Knife to kill!" << endl; }
}
 void Arrow::useWeapon()
void Arrow::useWeapon() {
{ cout << "Use arrow!" << endl;
    cout << "Use arrow!" << endl; }
}
 void King::fight()
void King::fight() {
{ cout << "The king:" ;
    cout << "The king:" ; if ( this->weapon == NULL)
    if ( this->weapon == NULL) {
    { cout << "You don't have a weapon! Please Set Weapon!" << endl;
        cout << "You don't have a weapon! Please Set Weapon!" << endl; }
    } else
    else {
    {  weapon->useWeapon();
        weapon->useWeapon(); }
    } }
}
 void Queen::fight()
void Queen::fight() {
{ cout << "The Queen:" ;
    cout << "The Queen:" ; if ( this->weapon == NULL)
    if ( this->weapon == NULL) {
    { cout << "You don't have a weapon! Please Set Weapon!" << endl;
        cout << "You don't have a weapon! Please Set Weapon!" << endl; }
    } else
    else {
    {   weapon->useWeapon();
        weapon->useWeapon(); }
    } }
}
 void Knight::fight()
void Knight::fight() {
{ cout << "The Knight:" ;
    cout << "The Knight:" ; if ( this->weapon == NULL)
    if ( this->weapon == NULL) {
    { cout << "You don't have a weapon! Please Set Weapon!" << endl;
        cout << "You don't have a weapon! Please Set Weapon!" << endl; }
    } else
    else {
    {   weapon->useWeapon();
        weapon->useWeapon(); }
    } }
}
 void Troll::fight()
void Troll::fight() {
{ cout << "The Troll:";
    cout << "The Troll:"; if ( this->weapon == NULL)
    if ( this->weapon == NULL) {
    { cout << "You don't have a weapon! Please Set Weapon!" << endl;
        cout << "You don't have a weapon! Please Set Weapon!" << endl; }
    } else
    else {
    {   weapon->useWeapon();
        weapon->useWeapon(); }
    } }
}
main.cpp
 #include <iostream>
#include <iostream> #include "Strategy.h"
#include "Strategy.h" using namespace std;
using namespace std; int main()
int main() {
{ //声明武器
    //声明武器 WeaponBehavior *sw = new Sword();//声明剑
    WeaponBehavior *sw = new Sword();//声明剑 WeaponBehavior *axe = new Axe();//声明斧头
    WeaponBehavior *axe = new Axe();//声明斧头 WeaponBehavior *arr = new Arrow();//声明弓箭
    WeaponBehavior *arr = new Arrow();//声明弓箭 WeaponBehavior *kn = new Knife();//声明刀
    WeaponBehavior *kn = new Knife();//声明刀 
     //声明角色
    //声明角色 Character *kin = new King();
    Character *kin = new King(); Character *qu = new Queen();
    Character *qu = new Queen(); Character *kni = new Knight();
    Character *kni = new Knight(); Character *tr = new Troll();
    Character *tr = new Troll(); 
     //调用打斗行为
    //调用打斗行为 kin->fight();
    kin->fight(); qu->fight();
    qu->fight(); kni->fight();
    kni->fight(); tr->fight();
    tr->fight(); cout << endl;
    cout << endl;
 //更换武器
    //更换武器 kin->setWeapon(sw);
    kin->setWeapon(sw); kin->fight();
    kin->fight(); cout << endl;
    cout << endl;
 kin->setWeapon(arr);
    kin->setWeapon(arr); kin->fight();
    kin->fight();
 return 0;
    return 0; }
}
策略(Strategy)模式体现了2个重要的面向对象设计原则:
    1.封装变化。
    2.针对接口编程。
 
                     
                    
                 
                    
                

 
     
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号