首页 > 代码库 > <C/C++ 版> 设计模式 学习之 策略模式+工厂模式

<C/C++ 版> 设计模式 学习之 策略模式+工厂模式

策略模式是一种定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少各种算法类与使用算法类之间的耦合。

策略模式的 strategy (COperate)类层为 context 定义了一些了可供重用的算法或者行为,继承有助于析取这些算法中的公公功能。

策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

每个算法可以保证自身没有错误 ,修改其中的一个不会影响到其他算法。

测试代码如下:

//Stra_Fact.h

//策略基类
class COperation
{
public:
	int number_a;
	int number_b;

public:
	virtual double GetResult();
};

//策略具体类—加法类
class AddOperation : public COperation
{
public:
	//构造函数
	AddOperation(int num_a,int num_b);	
	virtual double GetResult();
};

//策略具体类—减法类
class SubOperation : public COperation
{
public:
	//构造函数
	SubOperation(int num_a,int num_b);
	virtual double GetResult();
};

//策略具体类—求余类
class RemOperation : public COperation
{
public:
	//构造函数
	RemOperation(int num_a,int num_b);
	virtual double GetResult();
};

//上下文,用一个基类来配置
class Context
{
private:
	COperation* op;
public:
    Context(int num_a, int num_b, char sign);
	double GetResult();
};


//Stra_Fact.cpp

#include "Stra_Fact.h"

//策略基类方法实现
double COperation::GetResult()
{
	double result = 0;
	return result;
}

//策略加法类--构造函数
AddOperation::AddOperation(int num_a,int num_b)
{
	number_a = num_a;
	number_b = num_b;
}
//策略加法类--父类方法重写
double AddOperation::GetResult()
{
	return number_a + number_b;
}

//策略减法类--构造函数
SubOperation::SubOperation(int num_a,int num_b)
{
	number_a = num_a;
	number_b = num_b;
}
//策略减法类--父类方法重写
double SubOperation::GetResult()
{
	return number_a - number_b;
}

//策略求余类--构造函数
RemOperation::RemOperation(int num_a,int num_b)
{
	number_a = num_a;
	number_b = num_b;
}
//策略求余类--父类方法重写
double RemOperation::GetResult()
{
	return number_a % number_b;
}

//上下文,用一个基类来配置
Context::Context(int num_a, int num_b, char sign)
{
	op = new COperation;
    switch(sign)
	{
	case '+':
		{
			AddOperation * temp = new AddOperation(num_a,num_b);
			op = temp;
			break;
		}
	case '-':
		{
			SubOperation * temp = new SubOperation(num_a,num_b);
			op = temp;
			break;
		}
	case '%':
		{
			RemOperation * temp = new RemOperation(num_a,num_b);
			op = temp;
			break;
		}
	}
}
double Context::GetResult()
{
	return op->GetResult();
}



//user.h

#include "iostream"
#include "Stra_Fact.h"

using namespace std;

//客户端
int main()
{
    int num_a, num_b; 
	char sign;
	cout<<"put your first number : ";
    cin>>num_a;
	cout<<"put your second number : ";
	cin>>num_b;	
	cout<<"put your sign : ";
    cin>>sign;

	Context * context = new Context(num_a, num_b, sign);
	cout<<context->GetResult()<<endl;

     return 0;
}



<C/C++ 版> 设计模式 学习之 策略模式+工厂模式