首页 > 代码库 > 设计模式之: 策略模式

设计模式之: 策略模式

        在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。

组成

(1)Strategy—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
{
     定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
}

(2)ConcreteStrategy1ConcreteStrategy2ConcreteStrategy3—具体策略角色:包装了相关的算法和行为。
{
     实现了Strategy定义的接口,提供具体的算法实现。
}

(3)context—环境角色:持有一个策略类的引用,最终给用户调用。
{   
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
}


应用场景
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

UML图:


代码如下:
在这里我进行了将简单工程模式和策略模式的结合,这样能够使对象的new操作减少并且简单;
#include<iostream>
using namespace std;

enum strategy { 
	Strategy1;
	Strategy2;
	Strategy3;
 };

//Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。
class context
{
public:
	 context(strategy type)
	 {
	 	switch type
	 	{
	 			case Strategy1:
	 				pStrategy=new ConcreteStrategy1();
	 				break;
	 			case Strategy2:
	 				pStrategy=new ConcreteStrategy2();
	 				break;
	 			case Strategy3:
	 				pStrategy=new ConcreteStrategy3();
	 				break;
	 			default:
	 				break;

	 	}

	 };
	~ context(){delete pStrategy;};
	virtual void ContextInterface(){
		if (pStrategy)
            pStrategy->alogrithmInterface();
	};

private:
	Strategy* pStrategy;
	/* data */

};

//策略基类
class Strategy
{
public:
	Strategy();
	~Strategy();
	virtual void alogrithmInterface()=0;

	/* data */
};

//具体策略1
class ConcreteStrategy1:Strategy
{
public:
	ConcreteStrategy1();
	~ConcreteStrategy1();
	void alogrithmInterface()
	 {
	 	cout<<"Im ConcreteStrategy1!"

	 }
	/* data */
};
//具体策略2
class ConcreteStrategy2:Strategy
{
public:
	ConcreteStrategy2();
	~ConcreteStrategy2();
	void alogrithmInterface()
	 {
	 	cout<<"Im ConcreteStrategy2!"

	 }
	/* data */
};
//具体策略3
class ConcreteStrategy3:Strategy
{
public:
	ConcreteStrategy3();
	~ConcreteStrategy3();
	void alogrithmInterface()
	 {
	 	cout<<"Im ConcreteStrategy3!"

	 }
	/* data */
};

int main(int argc, char const *argv[])
{
	context* cont=new context(Strategy1);
	cont->ContextInterface();
	delete cont;
	cont=NULL;

	cont=new context(Strategy2);
	cont->ContextInterface();
	delete cont;
	cont=NULL;

	cont=new context(Strategy3);
	cont->ContextInterface();
	delete cont;
	cont=NULL;

	return 0;
}




设计模式之: 策略模式