Strategy模式的主要目的是使程序能够在运行期动态的改变所需要的办法,而且最主要的是,在各个模块中实现松耦合。Strategy模式中,Strategy模块提供一个公有接口(interface),然后Strategy模块通过组合(composite) 将他置身于Context中,Conetxt模块保持着一个指向Strategy的指针m_pStrategy,Context相应的操作都通过m_pStrategy指针代理(delegate)到具体的Strategy模块中去了。整个过程中很容易就实现了解耦的问题。
Strategy模式的结构如下:
图中,关键在于Context将相应的算法操作抽象到一个接口DoSomeAction中,然后通过代理把具体的实现放到Strategy中去。
大概代码如下:
class Strategy class ConcreteStrategyA : public Strategy class ConcreteStrategyB : public Strategy class Context public: void DoSomeAction() private: |
接下来写一个测试代码,很简单:
void main() { ConcreteStrategyA a; ConcreteStrategyB b; Context context; context.SetStrategy(&a); context.SetStrategy(&b); |
ConcreteStrategyA::DoAction(), this is slowly ConcreteStrategyB::DoAction(), this is fast |
以上程序我们甚至可以修改为:
class Context { public: void DoSomeAction(Strategy* pStrategy) { pStrategy->DoAction(); } }; |
void main() { ConcreteStrategyA a; ConcreteStrategyB b; Context context; context.DoSomeAction(&a); |
在Strategy模式中,其实告诉了我们一个很重要的原则:尽量使用对象组合(composite)而非继承(inherit)。在程序中我们很容易通过调用SetStrategy函数来更改具体的Strategy对象,也就是说,通过对不同对象的调用,从而达到在运行期间动态改变算法的目的,其实在我们运用组合而不是继承的时候,程序已经解耦合了许多。
暂时写这么多了,欢迎大家拍砖。