策略模式原理与C++实现

定义

定义一些列算法,把他们一个个封装起来,并且使他们可以相互替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展、子类化)。

C++实现

在不考虑策略模式的情况下,我们往往会写出以下代码:

cpp 复制代码
class CompressData {
public:
	void compress(const char* stg_name, char* data, int size) {
		if (strcmp(stg_name, "lz4") == 0) {
			// lz4算法实现数据压缩
		} else if (strcmp(stg_name, "zlib") == 0) {
			// zlib算法实现数据压缩
		} else {
			// 未知算法,不支持
		}
	}
};

可以看出,如果我需要新增一个gzip压缩算法,那么我就需要在代码中新增一段实现gzip算法的代码。这明显违背了开放封闭原则。因此,考虑使用策略模式,代码实现如下:

cpp 复制代码
class Strategy {
public:
	virtual void compress(char* data, int size) = 0;
	virtual ~Strategy() {}
};

class Lz4Strategy : public Strategy {
public:
	void compress(char* data, int size) 
	{
		// Lz4压缩算法实现
	}	
};

class ZlibStrategy : public Strategy {
public:
	void compress(char* data, int size)
	{
		// zlib压缩算法实现
	}
};

class GzipStrategy : public Strategy {
public:
	void compress(char* data, int size)
	{
		// Gzip压缩算法实现
	}
};

上述代码表明为每个策略单独创建一个类,这样在新增策略时,就只需要进行扩展即可。再来看CompressData类(上下文程序)如何实现。

cpp 复制代码
class CompressData{
private:
	Strategy* _stg;
public:
	CompressData(StrategyFactory* factory)
	{
		_stg = factory->createStrategy();
	}
	void compress(char* data, int size)
	{
		_stg->compress(data, size);
	}
	~CompressData()
	{
		delete _stg;
	}
};

这里会用到工厂方法模式,客户程序在选择使用何中压缩算法时,是根据传入的工厂来决定的。到这里我们可以看出来,新增一个压缩策略,只需要扩展一个对应的压缩算法类即可,并不需要修改上下文程序。

类图

其中Context就是上下文程序,是稳定的,所有具体的策略都继承自抽象的策略,是变化的。因此新增策略,只需要对代码进行扩展即可。

总结

  • Strategy及其子类为组件提供了一系列可重用的算法,使得类型在运行时方便的根据需要在各算法之间切换。
  • 策略模式消除了条件判断语句,含有许多条件判断的语句往往可以使用策略模式来解耦合。
  • 如果Strategy对象没有数据成员,那么各个上下文之间可以共享同一个Strategy对象,从而节省对象开销。
相关推荐
じ☆冷颜〃4 小时前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
西幻凌云21 小时前
认识设计模式——工厂模式
c++·设计模式·简单工厂模式·抽象工厂模式·工厂模式
崎岖Qiu1 天前
【设计模式笔记24】:JDK源码分析-Comparator中的「策略模式」
java·笔记·设计模式·jdk·策略模式
崎岖Qiu1 天前
【设计模式笔记23】:长文解析-深刻理解「装饰器模式」
java·笔记·设计模式·装饰器模式
阿波罗尼亚2 天前
Head First设计模式(十四) 设计原则 其他的模式
设计模式
山风wind2 天前
设计模式-责任链模式:让请求在链条中流动直到被处理
设计模式·责任链模式
invicinble2 天前
设计模式全局预览,以及为什么会
设计模式
小股虫2 天前
让系统“杀不死”:同步与异步场景下的弹性设计模式手册
分布式·微服务·设计模式·架构·团队建设·方法论
山风wind2 天前
设计模式:状态模式详解-让对象的行为随状态改变而改变
设计模式·状态模式
__万波__2 天前
二十三种设计模式(十八)--中介者模式
java·设计模式·中介者模式