//设计模式很重要,最近在看,大话设计模式是java版本的,尝试看能不能用C++来实现
#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};
//1.封装
class Operation
{
public:
static double GetResult(double numA,double numB,char operate);
protected:
private:
};
double Operation::GetResult(double numA,double numB,char operate)
{
double result=0;
switch(operate)
{
case '+':
result=numA+numB;
break;
case '-':
result=numA-numB;
break;
case '*':
result=numA*numB;
break;
case '/':
if (abs(numB)<std::numeric_limits<double>::epsilon())
{
throw DerivedByZero();
}
result=numA/numB;
break;
default:
break;
}
return result;
}
int main(int argc,char *argv[])
{
cout<<"请输入数字A 操作符operate 数字B(ex:10.0 + 20.0)"<<endl;
double numA,numB;
char opearte;
cin>>numA>>opearte>>numB;
try
{
cout<<"运算结果为:"<<Operation::GetResult(numA,numB,opearte)<<endl;
}
catch(DerivedByZero&)
{
cerr<<"除数为0"<<endl;
}
}
//问题:如果希望增加一个开根运算,则需要在switch里增加一个分支;问题是:你增加一个平方根
//运算却让加减乘除都参与编译,一不小心改错了,后果严重
//应该吧加减乘除分离,修改其中一个不影响其余几个,增加其他运算算法也不影响其他代码
//Solution:继承及多态
<pre name="code" class="cpp">#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};
class Operation
{
public:
virtual double GetResult(){return 0;}//不能只声明
double GetNumberA()
{
return numA;
}
double GetNumberB()
{
return numB;
}
void SetNumberA(double num)
{
numA=num;
}
void SetNumberB(double num)
{
numB=num;
}
private:
double numA;
double numB;
double result;
};
class OperationAdd:public Operation
{
public:
double GetResult()
{
return GetNumberA()+GetNumberB();
}
};
class OperationSub:public Operation
{
public:
double GetResult()
{
return GetNumberA()-GetNumberB();
}
};
class OperationMul:public Operation
{
public:
double GetResult()
{
return GetNumberA()*GetNumberB();
}
};
class OperationDiv:public Operation
{
public:
double GetResult()
{
if (abs(GetNumberB())<std::numeric_limits<double>::epsilon())
{
throw DerivedByZero();
}
return GetNumberA()/GetNumberB();
}
};
int main(int argc,char *argv[])
{
OperationAdd add;
OperationDiv div;
try
{
add.SetNumberA(10.0);
add.SetNumberB(20.0);
div.SetNumberA(10.0);
div.SetNumberB(0);
cout<<add.GetResult()<<endl;
cout<<div.GetResult()<<endl;
}
catch(DerivedByZero&)
{
cerr<<"除数为0"<<endl;
}
}
//问题:如何让计算器知道希望选用的是哪一种算法,上面例子没有进行输入交互
//Solution:简单工厂模式
#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};
class Operation
{
public:
virtual double GetResult(){return 0;}//不能只声明
double GetNumberA()
{
return numA;
}
double GetNumberB()
{
return numB;
}
void SetNumberA(double num)
{
numA=num;
}
void SetNumberB(double num)
{
numB=num;
}
private:
double numA;
double numB;
double result;
};
class OperationAdd:public Operation
{
public:
double GetResult()
{
return GetNumberA()+GetNumberB();
}
};
class OperationSub:public Operation
{
public:
double GetResult()
{
return GetNumberA()-GetNumberB();
}
};
class OperationMul:public Operation
{
public:
double GetResult()
{
return GetNumberA()*GetNumberB();
}
};
class OperationDiv:public Operation
{
public:
double GetResult()
{
if (abs(GetNumberB())<std::numeric_limits<double>::epsilon())
{
throw DerivedByZero();
}
return GetNumberA()/GetNumberB();
}
};
//增加简单工厂类
class OperationFactory
{
public:
static Operation* CreateOperate(char operate)
{
Operation *oper=NULL;
switch(operate)
{
case '+':
oper=new OperationAdd;
break;
case '-':
oper=new OperationSub;
break;
case '*':
oper=new OperationMul;
break;
case '/':
oper=new OperationDiv;
break;
default:
break;
}
return oper;
}
};
int main(int argc,char *argv[])
{
cout<<"请输入数字A 操作符operate 数字B(ex:10.0 + 20.0)"<<endl;
double numA,numB;
char opearte;
Operation *oper;
cin>>numA>>opearte>>numB;
try
{
oper=OperationFactory::CreateOperate(opearte);
oper->SetNumberA(numA);
oper->SetNumberB(numB);
cout<<"运算结果为:"<<oper->GetResult()<<endl;
}
catch(DerivedByZero&)
{
cerr<<"除数为0"<<endl;
}
delete oper;
}
//分析:如果要增加各种复杂的运算,需要增加相应的子类和修改运算类工厂,在switch增加分支
VS自动生成的UML图