一、概述
策略模式就是定义一组算法,将每个算法封装起来,并且使它们之间可以互换。
(1)Strategy抽象策略角色
每个策略或者算法必须具有的方法和属性
(2)ConcreteStrategy具体策略角色
实现策略中的操作,该类含有具体的算法
(3)Context封装角色,上下文角色
启封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化
class Strategy
{
public:
virtual void DoSomething();
};
class ConcreteStrategy1 : public Strategy
{
public:
virtual void DoSomething();
};
class ConcreteStrategy2 : public Strategy
{
public:
virtual void DoSomething();
};
class Context
{
public:
Context(Strategy* pStrategy)
:m_objStrategy(*pStrategy)
{
}
void DoAnything()
{
m_objStrategy.DoSomething();
}
private:
Strategy m_objStrategy;
};
void main()
{
Strategy* pStrategy = new ConcreteStrategy1();
Context context = new Context(pStrategy);
context.DoAnything();
}
二、总结
策略模式可以封装多个策略算法,保证对外提供“可自由切换”的策略,扩展性好。
策略模式需要上层模块必须知道有哪些策略,然后才能决定使用哪一个,这与迪米特法则相违背。策略模式的这一缺点,可以通过和其他模式结合来弥补,例如工厂方法模式、代理模式或享元模式。