策略模式
官方定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
个人理解:策略模式将各种不同的方式进行封装,都变成一个类,并且这些类都有一些共性,都有共同的目的,只是中间的方法和资源有些不同,这样我们就可以定义一个抽象基类,给一个接口,让子类进行继承,然后通过用户进行动态调用,决定用哪一种方式去实现。
例如就想旅游一样,我想去旅游就要制定不同的策略和路线规划,那么每种策略都可以进行封装成类,当用户开始旅行时来决定使用哪种方式进行。
适用:
- 多个类只是区别在表现行为的不同,在运行时选择具体要执行的行为
- 对客户隐藏自己的实现细节,彼此相互独立
优点:
- 可以提供不同的备用方案,方面用户进行选择,选择灵活性比较大
- 可以抽离出不同策略的公共部分,供其使用,减少了冗余度
- 避免使用多重条件(if-else),可以直接选择
缺点:
- 因为是客户端要用,则客户端必须知道所有的策略,才好决定用哪种,因此只适用于客户端知道所有所有的行为的情况
- 策略模式是把每个具体的策略实现都单独封装成类,如果备选很多,对象的数目也是很可观的。
#include <iostream>
using namespace std;
class WeaponBehavior
{
public:
void virtual useWeapon() = 0;
};
class AK47 :public WeaponBehavior
{
public:
void useWeapon()
{
cout << "Use AK47 to shoot!" << endl;
}
};
class Knife :public WeaponBehavior
{
public:
void useWeapon()
{
cout << "Use Knife to kill!" << endl;
}
};
class Character
{
public:
Character()
{
weapon = 0;
}
void setWeapon(WeaponBehavior *w)
{
this->weapon = w;
}
void fight(){
cout << "The king:";
if (this->weapon == NULL)
{
cout << "You don't have a weapon! Please Set Weapon!" << endl;
}
else
{
weapon->useWeapon();
}
}
private:
WeaponBehavior *weapon;
};
int main()
{
WeaponBehavior *ak47 = new AK47();
WeaponBehavior *knife = new Knife();
Character *kin = new Character();
kin->fight();
cout << endl;
kin->setWeapon(ak47);
kin->fight();
cout << endl;
kin->setWeapon(knife);
kin->fight();
return 0;
}