您的位置:首页 > 编程语言 > C语言/C++

开闭原则(C++)

2017-09-02 22:24 120 查看

概念

   对于扩展是开放的,对于更改是封闭的。面对新的需求,对程序的改动是通过新加代码而进行的,不是更改现有的代码。

简述

   开闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中出现频繁变化的那些部分做出抽象,对于应用程序每个部分都刻意进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

场景一:

   当前需要写一个加减法的计算器。可以这样实现。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息