策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。
如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,违背开闭原则。如果采用策略模式就能很好解决这些问题。
策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
简述:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。
策略模式的主要优点如下。
(1)多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句;
(2)策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码;
(3)策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的;
(4)策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
(5)策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
其主要缺点如下:
(1)客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类;
(2)策略模式造成很多的策略类。
原文链接:https://blog.csdn.net/qq_43990485/article/details/111217043
假设这样一个场景,玩游戏的时候,有匕首、AK47这样的装备,可以给角色装配,这时候节可以使用策略模式
#include <iostream>
using namespace std;
//武器策略
class WeaponStratery
{
public:
virtual void useWeapon() = 0;
};
//匕首
class Knife :public WeaponStratery
{
public:
virtual void useWeapon()
{
cout << "使用匕首......" << endl;
}
};
//AK47
class AK47 :public WeaponStratery
{
public:
virtual void useWeapon()
{
cout << "使用AK47......" << endl;
}
};
//角色,可以使用各种各样的武器
class Person
{
public:
//用构造函数 设置策略
void setWeapon(WeaponStratery* pWeapon)
{
this->pWeapon = pWeapon;
}
void play()
{
this->pWeapon->useWeapon();
}
/*
//析构函数
~Person()
{
if (pWeapon != NULL)
{
delete pWeapon;
pWeapon = NULL;
}
}*/
private:
WeaponStratery* pWeapon;
};
void test01()
{
//创建角色
Person* person = new Person;
//创建武器
WeaponStratery* knife = new Knife;
WeaponStratery* ak47 = new AK47;
person->setWeapon(knife); //装配匕首
person->play(); //开始玩耍
person->setWeapon(ak47);
person->play();
//释放
delete ak47;
delete knife;
delete person;
}
int main(int argc, int* argv[])
{
test01();
system("pause");
return 0;
}