开闭原则(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;}


原创粉丝点击