// Strategy.cpp : Defines the entry point for the console application.
//
//策略模式是定义了一系列算法的方法,这些算法工作原理是一样的,只是实现不同
//定义一个调用算法的接口,让客户端选择算法,以同样的方式调用算法
#include "stdafx.h"
#include <iostream.h>
class COperation//策略基类
{
public:
int m_nFirst;
int m_nSecond;
virtual double GetResult()
{
double dResult = 0;
return dResult;
}
};
//策略具体类————加法类
class AddOperation : public COperation
{
public:
AddOperation(int a,int b)
{
m_nFirst=a;
m_nSecond=b;
}
virtual double GetResult()
{
return m_nSecond+m_nFirst;
}
};
//策略具体类————减法
class SubOperation : public COperation
{
public:
SubOperation(int a,int b)
{
m_nFirst=a;
m_nSecond=b;
}
virtual double GetResult()//多态
{
return m_nFirst-m_nSecond;
}
};
//策略具体类————乘法
class MultiplyOperation : public COperation
{
public:
MultiplyOperation(int a,int b)
{
m_nFirst=a;
m_nSecond=b;
}
virtual double GetResult()
{
return m_nFirst*m_nSecond;
}
};
//策略具体类————除法
class DivideOperation : public COperation
{
public:
DivideOperation(int a,int b)
{
m_nFirst=a;
m_nSecond=b;
}
virtual double GetResult()
{
if (m_nSecond==0)
{
cout<<"除数不可以为零"<<endl;
return 'a';
}
else
return m_nFirst/m_nSecond;
}
};
class Context
{
private:
COperation* op;
public:
Context(COperation* temp)
{
op=temp;
}
double GetResult()
{
return op->GetResult();
}
};
//客户端
int main()
{
int a,b;
char c;
cin>>a>>b;
cout<<"请输入运算符:"<<endl;
cin>>c;
switch(c)
{
case '+':
COperation *Add =new AddOperation(a,b);
Context *context=new Context(Add);
cout<<context->GetResult()<<endl;
break;
case '-':
COperation *Add =new SubOperation(a,b);
Context *context=new Context(Add);
cout<<context->GetResult()<<endl;
break;
case '*':
COperation *Add =new MultiplyOperation(a,b);
Context *context=new Context(Add);
cout<<context->GetResult()<<endl;
break;
case '/':
COperation *Add =new DivideOperation(a,b);
Context *context=new Context(Add);
cout<<context->GetResult()<<endl;
break;
//default:
// break;
}
return 0;
}
策略模式是一种定义一系列算法的方法,所有这些算法完成的是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了
各种算法类与使用算法类之间的耦合,Strategy类为Context定义了一系列的可供重用的算法或行为。继承有助于析取这些算法中的公共功能,
除此之外,策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
算法的缺点:选择所有具体实现的职责由客户端对象承担,可以考虑与简单工程模式结合 将判断仿在Context中