Strategy模式

来源:互联网 发布:linux locale c 编辑:程序博客网 时间:2024/05/03 09:00


这里的关键就是将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再
通过委托的方式将具体的算法实现委托给具体的Strategy类来实现(ConcreteStrategeA
类)。

C++简单实现代码:

//strategy.h#ifndef _STRATEGY_H_#define _STRATEGY_H_class Strategy{public:Strategy();virtual ~Strategy();virtual void AlgrithmInterface() = 0;protected:private:};class ConcreteStrategyA:public Strategy{public:ConcreteStrategyA();virtual ~ConcreteStrategyA();void AlgrithmInterface();protected:private:};class ConcreteStrategyB:public Strategy{public:ConcreteStrategyB();virtual ~ConcreteStrategyB();void AlgrithmInterface();protected:private:};#endif //~_STRATEGY_H_


//Context.h#ifndef _CONTEXT_H_#define _CONTEXT_H_class Strategy;/***这个类是Strategy模式的关键,也是Strategy模式和Template模式的根本区别所在。*Strategy通过“组合”(委托)方式实现算法(实现)的异构,而Template模式则采取的是继承的方式*这两个模式的区别也是继承和组合两种实现接口重用的方式的区别*/class Context{public:Context(Strategy* stg);~Context();void DoAction();protected:private:Strategy* _stg;};#endif //~_CONTEXT_H_

//main.cpp#include "Context.h"#include "Strategy.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){Strategy* ps;ps = new ConcreteStrategyA();Context* pc = new Context(ps);pc->DoAction();if (NULL != pc)delete pc;return 0;}

Strategy模式的代码很直观,关键是将逻辑(算法)封装到一个类(Context)里面。

那策略模式和简单工厂模式有啥区别呢?

策略模式和简单工厂模式看起来非常相似,都是通过多态来实现不同子类的选取,这种思想应该是从程序的整体来看得出的。如果从使用这两种模式的角度来看的话,我们会发现在简单工厂模式中我们只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作。而策略模式,使用时必须首先创建一个想使用的类对象,然后将该对象最为参数传递进去,通过该对象调用不同的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。

结合上面的代码和下面的释义不难看出,其实两个的差别很微妙,Factory是直接创建具体的对象并用该对象去执行相应的动作,而Context将这个操作给了Context类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。



其实策略模式还可以和简单工厂模式结合起来使用,而且这样实现更好的封装。大致流程如下

Context* pc = new Context(type);

pc->DoAction();

其中Context内部根据type new出不同strategy,DoAction内部调用strategy的interface方法。这样结合用户只需要知道Context类就可以了,

而简单工厂和单独策略都需要知道两个类。这样耦合更低了。


原创粉丝点击