大话设计模式(C++实现)--简单工厂模式

来源:互联网 发布:广州软件培训学校 编辑:程序博客网 时间:2024/04/29 02:01

//设计模式很重要,最近在看,大话设计模式是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图



0 0