策略模式在《设计模式》一书中定义为行为模式,在实现一个功能中有多种算法和策略可供选择,客户端根据具体生产环境可以选择不同的方法以达到同样的效果。最快能想到的方法便是将所有能想到算法都硬编码进客户端,根据条件选择具体算法。但这是非常糟糕的方案,大量的算法代码堆积在客户端,导致客户端代码难以维护,所以这时候策略模式就派上用场了。
使用策略模式,客户端只需要维护一个策略(Strategy),在使用的时候选定要使用的具体策略实现。具体的策略实现由一个个单独的类来维护,并且这些具体实现是可以相互替换的,策略模式使得算法可以独立与使用它的客户而变化。
1.模式适用性
- 当客户端需要使用多种行为中的某一个来完成完成动作
- 当一种算法有多种实现方案可供选择
- 当需要向客户端隐藏复杂的算法与数据结构
- 一个类定义了多种行为,并且这些行为在这个类中以条件语句出现
2.模式结构
3.实现
例子:有一个商品统计程序有一个销量统计功能(SaleContext),该功能对商品进行销量统计,按销量从高到低排序。当前程序可以使用 快速排序(QsStrategy)、希尔排序(SsStrategy)、堆排序(HsStrategy) 三个算法,统计程序会根据数据选择不同的排序算法。
class SortStrategy
{
public:
virtual void Sort(int *arr);
protected:
SortStrategy();
virtual ~SortStrategy();
};
class QsStrategy : public SortStrategy
{
public:
/* quick sort implement */
virtual void Sort(int *arr);
};
class HsStrategy : public SortStrategy
{
public:
/* heap sort implement */
virtual void Sort(int *arr);
};
class SsStrategy : public SortStrategy
{
public:
/* shell sort implement */
virtual void Sort(int *arr);
};
class SaleContext
{
private:
int *_saleData;
SortStrategy *_ss;
public:
SaleContext(SortStrategy *p){_ss = p;}
void SortData() {_ss->Sort(_saleData);}
};
int main(int argc,char *argv[])
{
SaleContext *sale = new SaleContext(new QsStrategy);
sale->SortData();
}
4.与简单工厂模式的区别
在上一篇文章中说道简单工厂模式,策略模式看似与简单工厂模式相似,但实则不同。简单工厂模式关注的是对象的创建,让创建对象与具体的使用客户无关。而策略模式关注的是行为和算法的封装。策略模式提供新的算法到系统中,也方便让过时的算法退出系统,具体的选择哪一种算法有客户端来决定。