C++策略模式(Strategy)

本文详细介绍了策略模式的概念,通过UML类图和C++源码示例,展示了如何将相似类的行为或算法抽象出来,实现动态选择算法的过程。策略模式允许在运行时选择算法,使得系统更加灵活。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UML类图(仅供参考)如下:

策略模式解决的问题:

如果系统中的一些类仅仅在行为或算法上面有微微的不同,那么我们可以把这些相似的类和这些行为或算法抽象出来,然后在程序运行的过程中动态的选择使用哪种行为或算法

源码

#include <iostream>

// 抽象算法
class CStrategy
{
public:
	virtual ~CStrategy() {}

	// 这里需要你根据实际情况定义算法的接口形式
	virtual void Algorithm() = 0;
};

// 具体算法A
class CConcreteStrategyA :public CStrategy
{
public:
	virtual void Algorithm()
	{
		std::cout << "我是算法A" << std::endl;
	}
};

// 具体算法B
class CConcreteStrategyB :public CStrategy
{
public:
	virtual void Algorithm()
	{
		std::cout << "我是算法B" << std::endl;
	}
};

// 具体算法C
class CConcreteStrategyC :public CStrategy
{
public:
	virtual void Algorithm()
	{
		std::cout << "我是算法C" << std::endl;
	}
};

// 策略选择
class CContext
{
public:

	CContext() :m_pStrategy(NULL) {}
	~CContext()
	{
		if (NULL != m_pStrategy)
		{
			delete m_pStrategy;
			m_pStrategy = NULL;
		}
	}

	// 用于输入策略,然后选择相应的算法对象
	// 这里把字符串的值当成是一种策略
	void ContextInterface(const std::string &sJudge)
	{
		if (NULL != m_pStrategy)
		{
			delete m_pStrategy;
			m_pStrategy = NULL;
		}

		if ("A" == sJudge)
		{
			m_pStrategy = new CConcreteStrategyA();
		}
		else if("B" == sJudge)
		{
			m_pStrategy = new CConcreteStrategyB();
		}
		else if ("C" == sJudge)
		{
			m_pStrategy = new CConcreteStrategyC();
		}
		else
		{
			// ...
		}
	}

	// 根据上面方法的策略获得对应的算法对象
	// 根据算法对象计算结果值
	void GetResult()
	{
		m_pStrategy->Algorithm();
	}

private:

	CStrategy *m_pStrategy;
};

int main()
{
	CContext context;

	context.ContextInterface("A");
	context.GetResult();

	context.ContextInterface("B");
	context.GetResult();

	context.ContextInterface("C");
	context.GetResult();

	return 0;
}

好处

在策略模式中,所有算法都将是继承同一个父类,这样就可以任意添加新的算法,而不影响其他算法。对于CContext类,虽然要修改ContextInterface方法,也不满足开放封闭原则,但这是为了让选择策略在CContext中完成,让客户端只需要知道CContext一种类,不用知道具体的算法类。当然你可以不这么做,将策略的选择放在其他地方,也不会有太大的改动,当然在这个地方,如果配合着简单工厂模式或者工厂模式一起用,显得更好一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值