设计模式(3)–策略模式

Posted by Tango on September 14, 2015

策略模式在《设计模式》一书中定义为行为模式,在实现一个功能中有多种算法和策略可供选择,客户端根据具体生产环境可以选择不同的方法以达到同样的效果。最快能想到的方法便是将所有能想到算法都硬编码进客户端,根据条件选择具体算法。但这是非常糟糕的方案,大量的算法代码堆积在客户端,导致客户端代码难以维护,所以这时候策略模式就派上用场了。

使用策略模式,客户端只需要维护一个策略(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.与简单工厂模式的区别

在上一篇文章中说道简单工厂模式,策略模式看似与简单工厂模式相似,但实则不同。简单工厂模式关注的是对象的创建,让创建对象与具体的使用客户无关。而策略模式关注的是行为和算法的封装。策略模式提供新的算法到系统中,也方便让过时的算法退出系统,具体的选择哪一种算法有客户端来决定。