一、使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
4、最直观的理解是对象内部执行行为较多,传统的方法是使用条件分支, 如果摸个分支发生了变化,就需要更改对象的内部实现方式,在策略模式中则不需要。
5、常用在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护
二、实现方法
例如:对两个操作数进行的计算操作,计算两个数的加、减、乘、除,使用条件分支,代码编写如下
class COPerate
{
public:
int Operate(int num1, int num2, std::string & op)
{
if("+" == op)
{
return num1 + num2;
}
else if("-" == op)
{
return num1 - num2;
}
else if("*" == op)
{
return num1*num2;
}
else if("/" == op)
{
return num1/num2;
}
}
}
class IOp
{
public:
virtual int Operate(int num1, int num2) = 0;
}
class CAdd : public IOp
{
public:
int Operate(int num1, int num2)
{
return num1 + num2;
}
}
class CSub : public IOp
{
public:
int Operate(int num1, int num2)
{
return num1 - num2;
}
}
class CMul : public IOp
{
public:
int Operate(int num1, int num2)
{
return num1 * num2;
}
}
class CDiv : public IOp
{
public:
int Operate(int num1, int num2)
{
return num1 / num2;
}
}
class COPerate
{
public:
void init();
{
m_pOpreateMap.insert(std::make_pair("Add"), (new CAdd()));
m_pOpreateMap.insert(std::make_pair("Sub"), (new CSub()));
m_pOpreateMap.insert(std::make_pair("Mul"), (new CMul()));
m_pOpreateMap.insert(std::make_pair("Div"), (new CDiv()));
}
int Operate(int num1, int num2, std::string & op)
{
int ret;
auto it = m_pOpreateMap.find(op);
if (m_pOpreateMap.end() != it)
{
ret = it->second->Operate(num1, num2);
}
return ret;
}
std::map<std::string, IOp*>m_pOpreateMap;
}