c++策略模式strategy

意图:

       定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

适用性:

      许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

      需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。

      算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

      一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

clip_image022

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Strategy
{
public:
	virtual void AlgorithomInterface() {};
};

class ConcreteStrategy1 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 1" << endl;
	}
};

class ConcreteStrategy2 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 2" << endl;
	}
};

class ConcreteStrategy3 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 3" << endl;
	}
};

class Context
{
public:
	Context(){}
	Context(Strategy *strategy) :m_strategy(strategy){}
	~Context(){ delete m_strategy; }

	void ContextInterface()
	{
		m_strategy->AlgorithomInterface();
	}

private:
	Strategy *m_strategy;
};

int main()
{
	Context *pContextA = new Context(new ConcreteStrategy1());
	Context *pContextB = new Context(new ConcreteStrategy2());

	pContextA->ContextInterface();
	pContextB->ContextInterface();

	delete pContextA;
	delete pContextB;

	return 0;
}

二我们可以结合简单工厂模式来定义,因为在实际操作的过程中,我们会发现,在main函数中,也就是在客户端使用策略模式时,会创建非常多的Strategy,而这样就莫名的增加了客户端的压力,让客户端的复杂度陡然增加了。那么,我们就可以借鉴简单工厂模式,使策略模式 和简单工厂相结合,从而减轻客户端的压力,代码实现如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef enum StrategyType
{
	strategy1,
	strategy2,
	strategy3,
}STRATEGYTYPE;

class Strategy
{
public:
	virtual void AlgorithomInterface() {};
};

class ConcreteStrategy1 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 1" << endl;
	}
};

class ConcreteStrategy2 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 2" << endl;
	}
};

class ConcreteStrategy3 :public Strategy
{
	void AlgorithomInterface()
	{
		cout << "I am  AlgorithomInterface 3" << endl;
	}
};

class Context
{
public:
	Context(){}
	Context(STRATEGYTYPE type)
	{
		switch (type)
		{
		case strategy1:
			m_strategy = new ConcreteStrategy1;
			break;

		case strategy2:
			m_strategy = new ConcreteStrategy2;
				break;

		case strategy3:
			m_strategy = new ConcreteStrategy3;
				break;
		default:
			break;
		}
	}

	~Context(){ delete m_strategy; }

	void ContextInterface()
	{
		m_strategy->AlgorithomInterface();
	}

private:
	Strategy *m_strategy;
};

int main()
{
	Context *pContextA = new Context(strategy3);
	pContextA->ContextInterface();
	delete pContextA;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值