策略者模式

策略模式

官方定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

个人理解:策略模式将各种不同的方式进行封装,都变成一个类,并且这些类都有一些共性,都有共同的目的,只是中间的方法和资源有些不同,这样我们就可以定义一个抽象基类,给一个接口,让子类进行继承,然后通过用户进行动态调用,决定用哪一种方式去实现。

例如就想旅游一样,我想去旅游就要制定不同的策略和路线规划,那么每种策略都可以进行封装成类,当用户开始旅行时来决定使用哪种方式进行。

适用:

  • 多个类只是区别在表现行为的不同,在运行时选择具体要执行的行为
  • 对客户隐藏自己的实现细节,彼此相互独立

优点:

  • 可以提供不同的备用方案,方面用户进行选择,选择灵活性比较大
  • 可以抽离出不同策略的公共部分,供其使用,减少了冗余度
  • 避免使用多重条件(if-else),可以直接选择

缺点:

  • 因为是客户端要用,则客户端必须知道所有的策略,才好决定用哪种,因此只适用于客户端知道所有所有的行为的情况
  • 策略模式是把每个具体的策略实现都单独封装成类,如果备选很多,对象的数目也是很可观的。
#include 
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;
}

你可能感兴趣的:(设计模式)