策略模式是一种定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少各种算法类与使用算法类之间的耦合。
策略模式的 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; }
原文:http://blog.csdn.net/u010477528/article/details/42394027