在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。
组成:
(1)Strategy—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
{
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
}
{
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
}
(2)ConcreteStrategy1,ConcreteStrategy2,ConcreteStrategy3—具体策略角色:包装了相关的算法和行为。
{
实现了Strategy定义的接口,提供具体的算法实现。
}
{
实现了Strategy定义的接口,提供具体的算法实现。
}
(3)context—环境角色:持有一个策略类的引用,最终给用户调用。
UML图:

代码如下:
在这里我进行了将简单工程模式和策略模式的结合,这样能够使对象的new操作减少并且简单;
{
1、需要使用ConcreteStrategy提供的算法。
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
}
}
应用场景:
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
UML图:
代码如下:
在这里我进行了将简单工程模式和策略模式的结合,这样能够使对象的new操作减少并且简单;
#include<iostream>
using namespace std;
enum strategy {
Strategy1;
Strategy2;
Strategy3;
};
//Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。
class context
{
public:
context(strategy type)
{
switch type
{
case Strategy1:
pStrategy=new ConcreteStrategy1();
break;
case Strategy2:
pStrategy=new ConcreteStrategy2();
break;
case Strategy3:
pStrategy=new ConcreteStrategy3();
break;
default:
break;
}
};
~ context(){delete pStrategy;};
virtual void ContextInterface(){
if (pStrategy)
pStrategy->alogrithmInterface();
};
private:
Strategy* pStrategy;
/* data */
};
//策略基类
class Strategy
{
public:
Strategy();
~Strategy();
virtual void alogrithmInterface()=0;
/* data */
};
//具体策略1
class ConcreteStrategy1:Strategy
{
public:
ConcreteStrategy1();
~ConcreteStrategy1();
void alogrithmInterface()
{
cout<<"Im ConcreteStrategy1!"
}
/* data */
};
//具体策略2
class ConcreteStrategy2:Strategy
{
public:
ConcreteStrategy2();
~ConcreteStrategy2();
void alogrithmInterface()
{
cout<<"Im ConcreteStrategy2!"
}
/* data */
};
//具体策略3
class ConcreteStrategy3:Strategy
{
public:
ConcreteStrategy3();
~ConcreteStrategy3();
void alogrithmInterface()
{
cout<<"Im ConcreteStrategy3!"
}
/* data */
};
int main(int argc, char const *argv[])
{
context* cont=new context(Strategy1);
cont->ContextInterface();
delete cont;
cont=NULL;
cont=new context(Strategy2);
cont->ContextInterface();
delete cont;
cont=NULL;
cont=new context(Strategy3);
cont->ContextInterface();
delete cont;
cont=NULL;
return 0;
}