参照大话设计模式(程杰),梳理软件工程的程序设计思想,理解面向对象程序设计方法。所谓面向对象设计就是通过封装,继承,重载,多态等方法降低程序的耦合度,使各个功能模块相互独立,易于软件的维护和复用。
示例功能描述:实现一个简单的计算器,完成基本四则运算。运用简单工厂模式,将运算与客户端分离,并用一个工厂类分别生成相关运算所需要的对象,这个对象实现了运算基类的接口,在客户端调用这个接口返回运算结果。
UML类图:
类accumulate定义了运算的接口GetResult()和运算所需要的操作数numA, numB。类Add,Subtract,Multiply,Divided分别继承于accumulate,并实现了接口GetResult().Factory类与accumulate类相关联,并根据操作符生成相对应的运算类。
示例功能描述:实现一个简单的计算器,完成基本四则运算。运用简单工厂模式,将运算与客户端分离,并用一个工厂类分别生成相关运算所需要的对象,这个对象实现了运算基类的接口,在客户端调用这个接口返回运算结果。
UML类图:
类accumulate定义了运算的接口GetResult()和运算所需要的操作数numA, numB。类Add,Subtract,Multiply,Divided分别继承于accumulate,并实现了接口GetResult().Factory类与accumulate类相关联,并根据操作符生成相对应的运算类。
#include <iostream>
#include <string>
using namespace std;
class Accumulate
{
private:
double numA;
double numB;
public:
Accumulate()
{
numA = 0.0;
numB = 0.0;
}
virtual double GetResult()
{
double result = 0.0;
return result;
}
double getNumA(){return numA;}
double getNumB(){return numB;}
void setNumA(double n){this->numA = n;}
void setNumB(double n){this->numB = n;}
};
class OpAdd : Accumulate
{
public:
double GetResult()
{
double result;
result = getNumA() + getNumB() ;
return result;
}
};
class OpSubstruct : Accumulate
{
public:
double GetResult()
{
double result;
result = getNumA() - getNumB();
return result;
}
};
class OpMultiply : Accumulate
{
double GetResult()
{
double result = getNumA() * getNumB();
return result;
}
};
class OpDivied : Accumulate
{
double GetResult()
{
double result = 0.0;
if(getNumB() == 0) cout<<"Error\n";
else
{
result = getNumA() / getNumB();
}
return result;
}
};
class OperationFactory
{
public:
static Accumulate* createOperate(char op);
static void destroyOp(Accumulate *oper);
};
Accumulate* OperationFactory::createOperate(char op)
{
Accumulate *oper = NULL;
switch(op)
{
case '+':
oper = (Accumulate *) new OpAdd;
break;
case '-':
oper = (Accumulate *) new OpSubstruct;
break;
case '*':
oper = (Accumulate *) new OpMultiply;
break;
case '/':
oper = (Accumulate *) new OpDivied;
break;
}
return oper;
}
void OperationFactory::destroyOp(Accumulate *oper)
{
if(!oper)
delete oper;
return ;
}
int main()
{
cout<<"请输入数字A:";
double numA;
cin>>numA;
cout<<"请输入运算符(+,-,*,/)";
char al;
cin>>al;
cout<<"请输入数字B:";
double numB;
cin>>numB;
Accumulate *opra;
opra = OperationFactory::createOperate(al);
opra->setNumA(numA);
opra->setNumB(numB);
cout<<opra->GetResult()<<'\n';
OperationFactory::destroyOp(opra);
return 0;
}