上篇我们讲了迭代器模式,这篇我们再来讲一下使用率很高的策略模式,策略模式的本质就是实现算法的复用,将环境调用中的算法抽象出来单独为类,环境调用就只调用算法的抽象类,要添加或修改算法时就只修改算法的具体类就可以了,不影响环境类,符合开闭原则,非常方便。
策略模式:
以下代码在VS2012上编译通过
.h文件
class Strategy//抽象算法策略类
{
public :
virtual void algorithm();
};
class ConcreteStrategy:public Strategy//具体算法策略类1
{
public:
void algorithm();//算法1
};
class ConcreteStrategy2:public Strategy//具体算法策略类2
{
public:
void algorithm();//算法2
};
class Environment//环境调用类
{
private:
Strategy* m_strategy;
public:
Environment();
void setStrategy(Strategy* strategy_);
Strategy* getStrategy();
};
.cpp文件
void Strategy::algorithm()
{
cout<<"this is algorithm in Strategy"<<endl;
}
void ConcreteStrategy::algorithm()
{
cout<<"this is algorithm1 in ConcreteStrategy"<<endl;
}
void ConcreteStrategy2::algorithm()
{
cout<<"this is algorithm1 in ConcreteStrategy2"<<endl;
}
Environment::Environment()
{
m_strategy=NULL;
}
void Environment::setStrategy(Strategy* strategy_)
{
m_strategy=strategy_;
}
Strategy* Environment::getStrategy()
{
if(m_strategy==NULL)
{
cout<<"please init m_strategy with Strategy"<<endl;
}
return m_strategy;
}
调用文件
int _tmain(int argc, _TCHAR* argv[])
{
Environment* mEnv=new Environment();//创建调用环境
Strategy* mStrategy=new ConcreteStrategy();//创建具体的算法策略1
mEnv->setStrategy(mStrategy);//设置该环境下要调用的具体算法策略1
mEnv->getStrategy()->algorithm();//在该环境下执行具体算法策略1
Strategy* mStrategy2=new ConcreteStrategy2();//创建具体的算法策略2
mEnv->setStrategy(mStrategy2);//设置该环境下要调用的具体算法策略2
mEnv->getStrategy()->algorithm();//在该环境下执行具体算法策略2
return 0;
}
this is algorithm1 in ConcreteStrategy
this is algorithm1 in ConcreteStrategy2
以上调用可以看出在策略模式下,要添加一个算法非常方便,只要添加一个具体类继承于抽象算法类就可以了,然后调用的时候只需要在调用环境里设置一下你要调用的算法,最后就可以调用该算法了,该算法和具体调用环境耦合度非常低,所以其他任何调用环境都可以复用该算法了。