C++设计模式——策略模式(Strategy模式)

策略模式

概念

  • 定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。Strategy 可以使算法独立于使用算法的客户端

GOF定义的UML图

C++设计模式——策略模式(Strategy模式)_第1张图片

例子

不使用策略模式时

假设有一个APP,是中文版的,现在业务拓展需要支持英文版、法语版、德语版等等。大部分初学者的思路应该如下
1.定义枚举类
2.大量if else 或者 switch case判断,再实现具体内容

enum Language
{
	ENGLISH = 0,
	FRENCH,
	GERMAN
};

void Fun1(Language language)
{
	
	if (language == ENGLISH)
	{
		cout << "中文翻译成英文" << endl;
	}
	else if (language == FRENCH)
	{
		cout << "中文翻译成法文" << endl;
	}
	else if (language == GERMAN)
	{
		cout << "中文翻译成德文" << endl;
	}
}

那么此时有一个问题,当我们业务继续拓展时,未来可能还需要增加更多语言怎么办?比如添加日语、韩语等,此时我们就需要去添加一条if else判断。那么违背了开闭原则。而策略模式就很好的解决了此类问题。

使用策略模式时**

核心思想:创建一个抽象类提供算法接口,在子类中实现算法

1.定义一个策略抽象类,提供具体算法的实现(翻译语言)
2.通过创建新的子类,实现具体的算法(语言种类),当以后需要业务拓展时,创建新的子类,在子类实现新的的算法即可

Strategy.h

#include 
using namespace std;

//抽象类
class Strategy
{
public:
	virtual ~Strategy(){};
	virtual void Translation() = 0;//翻译接口

protected:
	Strategy(){};
};


class English : public Strategy
{
public:
	English(){};
	~English(){};

	void Translation()
	{
		cout << "中文翻译成英文" << endl;
	}
};

class French : public Strategy
{
public:
	French(){};
	~French(){};

	void Translation()
	{
		cout << "中文翻译成法文" << endl;
	}
};

class German : public Strategy
{
public:
	German(){};
	~German(){};

	void Translation()
	{
		cout << "中文翻译成德文" << endl;
	}
};

主函数调用

void Fun2(Strategy* strategy)
{
	strategy->Translation();
}

int main()
{
	Strategy* strategy = new English();
	Fun2(strategy);

	while (1);
	return 0;
}

策略模式很好的解决了此类的问题,将业务逻辑具体实现和抽象接口之间的解耦。当以后需要添加新的翻译语种时,添加新的语言类(变化),从外部传入即可,而内部的代码实现了复用(稳定)

适用场景

  • 出现同一抽象有多个子类,需要用if-else或者switch-case来选择使用哪个子类的时候
  • 对同一类型问题有不同的处理方式

优缺点

优点

  • 各自使用封装的算法,可以很容易地引入新的算法来满足相同的接口。
  • 由于实现的是同一个接口,所以策略之间可以自由切换。
  • Strategy 使客户端能够选择所需的算法,而无需使用 switch/case 或 if/else 语句。
  • 算法的细节完全封装在 Strategy 类中,因此,可以在不影响 Context 类的情况下更改算法的实现。

缺点:

  • 客户端必须知道所有的策略,了解它们之间的区别,以便适时选择恰当的算法。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量

你可能感兴趣的:(C/C++)