策略模式:
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
适用性:
1、 许多相关的类仅仅是行为有异。策略模式提供了一种用多个行为中的一个行为来配置一个类的方法。
2、 需要使用一个算法的多个变体。
3、 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构。
4、 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的策略类中以代替这些条件语句。
结构图:
实现:
class Context;
//四则运算策略
class ArithmeticStrategy
{
public:
//把Context传给策略类,以便能方法所需要的数据
virtual void Computing(Context *pContext) = 0;
virtual~ArithmeticStrategy()
{ }
};
class Context
{
public:
Context(inta, int b,ArithmeticStrategy *pStrategy)
{
m_valueA = a;
m_valueB = b;
m_pStrategy = pStrategy;
}
//设置不同的策略
voidSetStrategy(ArithmeticStrategy *pStrategy)
{
m_pStrategy = pStrategy;
}
voidOperation()
{
m_pStrategy->Computing(this);
}
intGetA()
{
returnm_valueA;
}
intGetB()
{
returnm_valueB;
}
private:
int m_valueA;
int m_valueB;
ArithmeticStrategy *m_pStrategy;
};
//加法策略
class AddStrategy:publicArithmeticStrategy
{
public:
void Computing(Context *pContext)
{
cout<<"AddStrategyCompute Result is : "<<
pContext->GetA()<< " + "<<pContext->GetB()<<" = "<<pContext->GetA() + pContext->GetB()<<endl;
}
};
//减法策略
class SubStrategy:publicArithmeticStrategy
{
public:
voidComputing(Context *pContext)
{
cout<<"SubStrategy Compute Result is : "<<
pContext->GetA()<<" - "<<pContext->GetB()<<" = "<<pContext->GetA() - pContext->GetB()<<endl;
}
};
//乘法策略
class MulStrategy:publicArithmeticStrategy
{
public:
voidComputing(Context *pContext)
{
cout<<"MulStrategy Compute Result is : "<<
pContext->GetA()<<" * "<<pContext->GetB()<<" = "<<pContext->GetA() * pContext->GetB()<<endl;
}
};
//除法策略,这里仅仅做简单的例子,就不判断除数是否为0了
class DivStrategy:publicArithmeticStrategy
{
public:
voidComputing(Context *pContext)
{
cout<<"DivStrategy Compute Result is : "<<
pContext->GetA()<<" / "<<pContext->GetB()<<" = "<<((double)pContext->GetA() /pContext->GetB())<<endl;
}
};