Strategy

Strategy模式的主要目的是使程序能够在运行期动态的改变所需要的办法,而且最主要的是,在各个模块中实现松耦合。Strategy模式中,Strategy模块提供一个公有接口(interface),然后Strategy模块通过组合(composite) 将他置身于Context中,Conetxt模块保持着一个指向Strategy的指针m_pStrategy,Context相应的操作都通过m_pStrategy指针代理(delegate)到具体的Strategy模块中去了。整个过程中很容易就实现了解耦的问题。

Strategy模式的结构如下:

图中,关键在于Context将相应的算法操作抽象到一个接口DoSomeAction中,然后通过代理把具体的实现放到Strategy中去。

大概代码如下:

class Strategy
{
public:
    virtual void
DoAction() = 0;
};

class ConcreteStrategyA : public Strategy
{
public:
     void
DoAction() 
     {
          cout << "ConcreteStrategyA::DoAction(), this is slowly" << endl;
     }
};

class ConcreteStrategyB : public Strategy
{
public:
     void
DoAction()
     {
          cout << "ConcreteStrategyB::DoAction(), this is fast" << endl;
     }
};

class Context
{
public:
     Context() : m_pStrategy(NULL) {}

public:
     void
SetStrategy(Strategy* pStrategy)
     {
          m_pStrategy = pStrategy;
     }

     void DoSomeAction()
     {
          m_pStrategy->DoAction();
     }

private:
     Strategy* m_pStrategy;
};

接下来写一个测试代码,很简单:

void main()
{
     ConcreteStrategyA a;
     ConcreteStrategyB b;
     Context context;

     context.SetStrategy(&a);
     context.DoSomeAction();

     context.SetStrategy(&b);
     context.DoSomeAction();
}

以上程序段输出为:
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);
     context.DoSomeAction(&b);
}

当然,这个可能需要试具体的情况而定,最主要的是,你要理解和知道Strategy模式是怎么工作的。

在Strategy模式中,其实告诉了我们一个很重要的原则:尽量使用对象组合(composite)而非继承(inherit)。在程序中我们很容易通过调用SetStrategy函数来更改具体的Strategy对象,也就是说,通过对不同对象的调用,从而达到在运行期间动态改变算法的目的,其实在我们运用组合而不是继承的时候,程序已经解耦合了许多。

暂时写这么多了,欢迎大家拍砖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值