admin管理员组

文章数量:1530517

声明:本博文篇幅短,适合review。

一、概念

       策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

二、模式结构图

class Strategy
{
public:
	Strategy();
	virtual ~Strategy();

	virtual void algrithmInterface() = 0;
};

class ConcreteStrategyA : public Strategy
{
public:
	ConcreteStrategyA();
	~ConcreteStrategyA();

	void algrithmInterface(){
		cout<<" ConcreteStrategyA algrithmInterface"<<endl;
	}
};

class ConcreteStrategyB : public Strategy
{
public:
	ConcreteStrategyB();
	~ConcreteStrategyB();

	void algrithmInterface(){
		cout<<" ConcreteStrategyB algrithmInterface"<<endl;
	}
};

class Context
{
public:
	Context(Strategy * stg){
		mStg = stg;
	}
	~Context(){
		if (!mStg){
			delete mStg;
		}
	}

	void contextInterface(){
		mStg->algrithmInterface();
	}
private:
	Strategy * mStg;
};

void main(){
	Strategy * stgA = new ConcreteStrategyA();
	Context * ct = new Context(stgA);
	ct->contextInterface();
}

三、例子

class IMGFormat
{
public:
	IMGFormat();
	virtual ~IMGFormat();

	virtual void formatImage() = 0;
};

class FormatPNG : public IMGFormat
{
public:
	FormatPNG();
	~FormatPNG();

	void formatImage(){
		cout<<" FormatPNG formatImage"<<endl;
	}
};

class FormatJPG : public IMGFormat
{
public:
	FormatJPG();
	~FormatJPG();

	void formatImage(){
		cout<<" FormatJPG formatImage"<<endl;
	}
};

class FormatTool
{
public:
	FormatTool(IMGFormat * fmt){
		mFmt = fmt;
	}
	~FormatTool(){
		if (!mFmt){
			delete mFmt;
		}
	}

	void format(){
		mFmt->formatImage();
	}
private:
	IMGFormat * mFmt;
};

void main(){
	FormatTool * ftPNG = new FormatTool(new FormatPNG());
	ftPNG->format();
	FormatTool * ftJPG = new FormatTool(new FormatJPG());
	ftJPG->format();

	delete ftPNG;
	delete ftJPG;
}

四、优缺点

       Strategy 通过“组合”(委托)方式实现算法 (实现)的异构,而 Template 模式则采取的是继承的方式

       1、优点

             a、提高了代码复用性。

             b、使用组合替代继承,可以在运行时决定算法。

             c、使用策略模式可以避免使用多重条件转移语句。

       2、缺点

             a、要使用策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点。

             b、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

本文标签: 策略模式Strategy