简介
策略模式是定义一系列算法的方法,从概念上看所有这些算法都是相同的工作,只是实现不同,它可以通过相同的方式调用所有的算法,减少算法类与使用算法类之间的耦合
常用的场景
1.客户端提供一个方法接口,需要多个算法类切换使用。算法类的功能相同但是表现形式不一致的时候
2.算法类存在扩展需求或者需要根据不同情况切换算法类的时候
3.对外隐藏算法细节
优点
1.策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2.使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
缺点
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
2.由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
和其他设计模式的区别:
1,与状态模式
在解决的问题上,状态模式是解决内在状态的改变,而策略模式是解决内部算法的改变。在解决的方法上,状态模式是自我控制状态的改变,而策略模式是由外部制定使用使用啥策略。
2,简单工厂模式
简单工厂模式是创建型模式,关注对象的创建。策略模式是行为型模式,关注行为的封装。简单工厂模式是根据不同的条件返回一个适合的类给你使用,然后调用者使用工厂类返回的类去完成相应的操作。而策略模式是必须首先创建一个想使用的类实例,然后实例被当作参数传递进去,既而通过该实例去调用不用的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。
测试代码
#include <iostream>
using namespace std;
class OperationBase
{
public:
OperationBase(){};
virtual int Openrate(int a){return 0;};
};
class OperationAdd : public OperationBase
{
public:
OperationAdd(int i):a(i){}
~OperationAdd(){}
int Openrate(int i)
{
return i+a;
}
private:
int a;
};
class OperationSub : public OperationBase
{
public:
OperationSub(int i):a(i){}
~OperationSub(){}
int Openrate(int i)
{
return a-i;
}
private:
int a;
};
class OperationMul : public OperationBase
{
public:
OperationMul(int i, int j):a(i),b(j){}
~OperationMul(){}
int Openrate(int i)
{
return a*i*b;
}
private:
int a;
int b;
};
class Operation
{
public:
int getResult(char i)
{
int ret = 0;
OperationBase* object = NULL;
switch(i)
{
case '+':
object = new OperationAdd(100);
ret = object->Openrate(100);
break;
case '-':
object = new OperationMul(100,1);
ret = object->Openrate(100);
break;
case '*':
object = new OperationSub(100);
ret = object->Openrate(100);
break;
default:
break;
}
return ret;
}
};
void main()
{
Operation object;
cout<<object.getResult('+')<<endl;
system("PAUSE");
}