概念
Strategy模式也叫策略模式是行为型模式之一。它对一系列算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。
策略模式结构图
Strategy: 策略算法抽象;
ConcreteStrategy: 各种策略(算法)的具体实现;
Context: 策略的外部封装类,或者说是策略的容器类,根据不同策略执行不同的行为,策略由外部条件决定。
实例代码
#include <iostream>
using namespace std;
class Strategy
{
public:
virtual ~Strategy() {}
virtual void crypt() = 0;
};
class AES : public Strategy
{
public:
void crypt()
{
cout<<"AES strategy~"<<endl;
}
};
class DES : public Strategy
{
public:
void crypt()
{
cout<<"DES strategy~"<<endl;
}
};
class Context
{
public:
// Context(Strategy* strategy)
// {
// m_pStrategy = strategy;
// }
void setStrategy(Strategy* strategy)
{
m_pStrategy = strategy;
}
void doWork()
{
m_pStrategy->crypt();
}
private:
Strategy* m_pStrategy;
};
int main()
{
/*
//使用哪一种算法是写死在客户端的(不推荐使用)
AES* pAES = new AES();
pAES->crypt();
delete pAES;
*/
//使用策略模式(面向抽象类编程)
Strategy* pStrategy = NULL;
//pStrategy = new AES();
pStrategy = new DES();
Context* pContext = new Context();
pContext->setStrategy(pStrategy);
pContext->doWork();
delete pStrategy;
delete pContext;
return 0;
}
运行结果
策略模式的优点
策略模式提供了管理相关算法族的方法、策略模式提供了可以替换继承关系的办法、使用策略模式可以避免使用多重条件转移语句。