一、描述
Strategy模式和Template模式要解决的问题是类似的。Template模式使用继承来变换部分算法,Strategy模式则使用代理和组合来变换所有的算法并支持动态变换。以后,将使用context对象在运行期动态的分配具体的算法。同样,通过使用context对象,客户类将从依赖的算法接口中分离出来,通过context对象可以提供更多的泛化接口。
二、结构图
Context(应用场景):
1. 需要使用ConcreteStrategy提供的算法
2. 内部维护一个Strategy的实例
3. 负责动态设置运行时Strategy具体的实现算法
4. 负责跟Strategy之间的交换和数据传递
Strategy(抽象策略类):
定义一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
实现了Strategy定义的接口,提供具体的算法实现
三、代码实现
class Strategy
{
public:
virtual ~Strategy(void) { }
virtual void AlgorithmInterface() = 0;
};
class ConcreteStrategy1 : public Strategy
{
public:
ConcreteStrategy1() { }
~ConcreteStrategy1() { }
public:
virtual void AlgorithmInterface()
{
printf("[ConcreteStrategy1] AlgorithmInterface() Called. \n");
}
};
class ConcreteStrategy2 : public Strategy
{
public:
ConcreteStrategy2() { }
~ConcreteStrategy2() { }
public:
virtual void AlgorithmInterface()
{
printf("[ConcreteStrategy2] AlgorithmInterface() Called. \n");
}
};
class Context
{
public:
Context(Strategy* pStrategy) : m_pStrategy(pStrategy) { }
~Context() { }
public:
void ContextInterface()
{
m_pStrategy->AlgorithmInterface();
}
private:
Strategy* m_pStrategy;
};
Demo代码:
void StrategyDemo()
{
Strategy* pStrategy = new ConcreteStrategy2;
Context context(pStrategy);
context.ContextInterface();
delete pStrategy;
}
详细介绍:http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html