这些天开始看设计模式这本书,起初对于设计模式是陌生的更加不知其有什么作用,但看了第一章后就已经让我受益匪浅了,让我对代码的编写有了新的认识,不再是枯燥乏味,而更多的是一门艺术的体现。
现在倘若让你利用C++,Java,C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得出结果。我相信这对绝大多数有编程语言底子的人来说不是问题。一个main函数,在终端显示输入数字和运算符,并对输入的运算符进行if或者switch判断,来得出运算后的结果。
没错程序到这里就编写完了,功能也是完全符合要求,但这往往不是出题人想要的答案。这样的代码本身没有错,但是没有任何吸睛的地方,站在计算器的角度上,为了实现而实现,程序不容易维护,不容易扩展,不容易复用,从而达不到高质量代码的要求。因此我们需要对代码进行改进,要用面向对象的方法去实现,通过封装,继承,多态把程序的耦合度降低,彼此之间互不影响,使得程序更加的灵活,容易修改,并且易于复用。具体到本题的计算器例子中来,将计算和显示分开来,我们可以创建一个算法类,一个工厂类(用来new出不同的运算类),四种运算符号类派生于算法类,工厂类根据终端不同符号而生产出不同的符号类,再利用多态的方式获得不同符号类所计算出的结果。如果这个时候想添加一种新的运算方式(比如求根号),只需要在算法类中派生出一个根号子类,同时在工厂类中添加一个新的 选项就好了,别的运算方式完全触及不到,若要进行修改也只要对目标类进行操作就行,可以说这样的代码才符合出题人的要求,因而,考虑全面,将代码视作一门艺术来写,会让你收获良多,下面是自己写的本题计算器代码:
#include <iostream>
using namespace std;
class Operation //定义一个算法类(作为基类)
{
private:
double NumberA ; //操作数 NumberA
double NumberB ; //操作数 NumberB
public:
void SetNumberA(double A){ NumberA = A ;} //给操作数A赋值
void SetNumberB(double B){ NumberB = B ;} //给操作数B赋值
double GetNumberA(){ return NumberA ;} //获取操作数A的值
double GetNumberB(){ return NumberB ;} //获取操作数B的值
virtual double GetResult() //虚函数GetResult() 利用多态实现派生类的GetResult()函数
{
double dblresult ;
return dblresult ;
}
};
class OperationAdd : public Operation //加法算法类
{
double GetResult()
{
double dblresult ;
double NumberA ;
double NumberB ;
NumberA = this->GetNumberA() ;
NumberB = this->GetNumberB() ;
dblresult = NumberA + NumberB ;
return dblresult ;
}
};
class OperationSUB : public Operation //减法算法类
{
double GetResult()
{
double dblresult ;
double NumberA ;
double NumberB ;
NumberA = this->GetNumberA() ;
NumberB = this->GetNumberB() ;
dblresult = NumberA - NumberB ;
return dblresult ;
}
};
class OperationMUL : public Operation //乘法算法类
{
double GetResult()
{
double dblresult ;
double NumberA ;
double NumberB ;
NumberA = this->GetNumberA() ;
NumberB = this->GetNumberB() ;
dblresult = NumberA * NumberB ;
return dblresult ;
}
};
class OperationDIV : public Operation //除法算法类
{
double GetResult()
{
double dblresult ;
double NumberA ;
double NumberB ;
NumberA = this->GetNumberA() ;
NumberB = this->GetNumberB() ;
try
{
if(NumberB == 0)
{
throw"对不起,除数不能为为0 !" ;
}
else
{
dblresult = NumberA / NumberB ;
return dblresult ;
}
}
catch (const char * message)
{
cout<<message<<endl ;
}
}
};
class OperationFactory //工厂类,用于生成算法类
{
private:
Operation * pOperation ; //声明一个算法类的指针
public:
Operation * createOperation(char m_operate) //根据运算符生成不同的算法类
{
switch(m_operate)
{
case '+' :
{
pOperation = new OperationAdd ;
break;
}
case '-' :
{
pOperation = new OperationSUB ;
break;
}
case '*' :
{
pOperation = new OperationMUL ;
break;
}
case '/' :
{
pOperation = new OperationDIV ;
break;
}
}
return pOperation ;
}
};
int main()
{
double NumberA,NumberB ;
char btoperate ;
OperationFactory objOperationFactory ;
try
{
cout<<"请输入数字A :";
cin>>NumberA ;
cout<<"请输入运算符(+、-、*、/) :";
cin>>btoperate ;
cout<<"请输入数字B :";
cin>>NumberB ;
Operation * pOperation = objOperationFactory.createOperation(btoperate) ;
pOperation->SetNumberA(NumberA) ;
pOperation->SetNumberB(NumberB) ;
cout<<"计算结果为:"<<pOperation->GetResult()<<endl ;
}
catch (exception &e)
{
cout<<"对不起,您的输入有误! "<<endl ;
}
return 0 ;
}
这里是设计模式这本书的下载地址: 大话设计模式