C++实现策略(Strategy)模式时间:2021-03-06 21:58:28 策略(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.针对接口编程。