开闭原则(C++)
来源:互联网 发布:火车头采集数据库发布 编辑:程序博客网 时间:2024/05/16 19:32
概念
对于扩展是开放的,对于更改是封闭的。面对新的需求,对程序的改动是通过新加代码而进行的,不是更改现有的代码。
简述
开闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中出现频繁变化的那些部分做出抽象,对于应用程序每个部分都刻意进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
场景一:
当前需要写一个加减法的计算器。可以这样实现。
UML类图:
代码:
#include <stdio.h>#include <iostream>//计算器类class Calculator{public:Calculator(){}~Calculator() {};double getompute(char c){switch (c){case '+':return mA + mB;break;case '-':return mA - mB;break;default:break;}}public:double mA;double mB;};//客户端int main(void){Calculator calculator;while (true){std::cout << "请输入数字:";std::cin >> calculator.mA;std::cout << "请输入数字:";std::cin >> calculator.mB;std::cout << "进行计算:";char c = '0';std::cin >> c;std::cout << "计算结果:" << calculator.getompute(c) << std::endl;}return 0;}
场景二:
由于需求变化,现在需要加上乘法和除法。
代码:
//计算器类class Calculator{public:Calculator(){}~Calculator() {};double getompute(char c){switch (c){case '+':return mA + mB;break;case '-':return mA - mB;break;case '*':return mA * mB;break;case '/':return mA / mB;break;default:break;}}public:double mA;double mB;};
修改后也可以实现功能,但如果需要再添加开方,取余等功能。必须再次修改Calculator,明显违背了开闭原则。
场景三:
对Calculator进行改进
UML类图:
代码:
#include <stdio.h>#include <iostream>//计算器类 class Calculator{public:Calculator(){}~Calculator() {};//抽象接口类,子类实现virtual double getompute(){return 0;}public:double mA;double mB;};//除class Division : public Calculator{public:virtual double getompute(){return mA / mB;}};//乘class Multiplication : public Calculator{public:virtual double getompute(){return mA * mB;}};//减class Subtraction : public Calculator{public:virtual double getompute(){return mA - mB;}};//加class Addition : public Calculator{public:virtual double getompute(){return mA + mB;}};//工厂,根据不同的计算方式生产类Calculator* CreateCalculator(char c){switch (c){case '+':return new Addition;break;case '-':return new Subtraction;break;case '*':return new Multiplication;break;case '/':return new Division;break;default:return NULL;break;}}//客户端int main(void){Calculator *calculator = NULL;calculator = CreateCalculator('-');calculator->mA = 10;calculator->mB = 5;std::cout << "计算结果:" << calculator->getompute() << std::endl;while (true) {};return 0;}
阅读全文
0 0
- 开闭原则(C++)
- 开闭原则(OCP)
- 开闭原则(OCP)
- 设计原则之开闭原则(一)
- 设计模式原则(2)开闭原则
- 设计模式原则(4):开闭原则
- 设计模式原则(6):开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- 开闭原则
- linux操作系统基础
- CMD中调用R
- 利用ActivityLifecycleCallbacks优雅的退出应用
- 云计算之路-阿里云上-新车限行:新购服务器无法访问任何远程25端口
- ubuntu下面使用clion
- 开闭原则(C++)
- bzoj1002 [FJOI2007]轮状病毒
- bzoj1003 [ZJOI2006]物流运输
- bzoj1008 [HNOI2008]越狱
- 堆排序的过程及简单实现
- bzoj1012 [JSOI2008]最大数maxnumber
- hdu 2066 一个人的旅行 最短路径floyd算法
- Java反射
- bzoj1036 [ZJOI2008]树的统计Count