一、UML类图
面向对象编程时,在整理对象之间关系时,用UML类图梳理,会更加清晰。
二、简单工厂模式
1.简单工厂模简介
简单工厂模式,利用一个工厂来生产不同类型的对象,达到服务层代码根据需求更改时,客户端代码接口不用进行修改。客户端可直接创建自己新增的需求对象并进行操作。由于比较简单,见代码很容易理解,故不做赘述。
2.C++代码如下
//定义基类操作数OperatorDP #ifndef _MOPERATORDP_HPP #define _MOPERATORDP_HPP class OperatorDP{ public: OperatorDP() = default; OperatorDP(double _num1, double _num2) : num1(_num1), num2(_num2){} double getNum1(){return num1;} double getNum2(){return num2;} void setNum1(double num){num1 = num;} void setNum2(double num){num2 = num;} virtual double getResult() = 0; // 虚函数 private: double num1; double num2; };#endif
// 加法类 #ifndef _ADDDP_HPP #define _ADDDP_HPP #include"operatordp.hpp" class AddDP : public OperatorDP{ public: AddDP(double n1, double n2):OperatorDP(n1, n2){} virtual double getResult(){ return getNum1() + getNum2(); } }; #endif
//减法类 #ifndef _SUBTRACTDP_HPP #define _SUBTRACTDP_HPP #include"operatordp.hpp" class SubtractDP:public OperatorDP{ public: SubtractDP(double n1, double n2):OperatorDP(n1, n2){} virtual double getResult(){ return getNum1() - getNum2(); } }; #endif
//乘法类 #ifndef _MULTIPLYDP_HPP #define _MULTIPLYDP_HPP #include"operatordp.hpp" class MultiplyDP:public OperatorDP{ public: MultiplyDP(double n1, double n2):OperatorDP(n1, n2){} virtual double getResult(){ return getNum1() * getNum2(); } }; #endif
//除法类 #ifndef _DIVIDEDP_HPP #define _DIVIDEDP_HPP #include<iostream> #include<cmath> #include"operatordp.hpp" using namespace std; class DivideDP : public OperatorDP{ public: DivideDP(double n1, double n2):OperatorDP(n1, n2){} virtual double getResult(){ if(abs(getNum2()) < e){ cout << "divisor can't be zero"<<endl; getchar(); abort(); } else{ return getNum1() / getNum2(); } } private: static const double e; }; const double DivideDP::e = 0.000000000001; #endif
// 测试 #include<iostream> #include"adddp.hpp" #include"dividedp.hpp" #include"multiplydp.hpp" #include"subtractdp.hpp" using namespace std; int main(){ AddDP myadd(5,3); cout << myadd.getResult()<<endl; SubtractDP mysubtract(6,2); cout << mysubtract.getResult()<<endl; DivideDP mydivide(5,0); cout << mydivide.getResult()<<endl; MultiplyDP mymultiply(10,2); cout << mymultiply.getResult()<<endl; getchar(); return 0; }
通过代码我们很容易就能发现,如果客户想新增加一个需求比如指数运算,那么只需新建一个继承OperatorDP的指数类,然后实现里面的方法getResult()就行了。对客户端来书,只需创建一个新的指数类对象,并调用方法getResult()。可见客户使用方法没变。服务端代码也实现了解耦,使代码更加易于维护。
来源:https://www.cnblogs.com/yb-blogs/p/12381791.html