概念
对于扩展是开放的,对于更改是封闭的。面对新的需求,对程序的改动是通过新加代码而进行的,不是更改现有的代码。
简述
开闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中出现频繁变化的那些部分做出抽象,对于应用程序每个部分都刻意进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
场景一:
当前需要写一个加减法的计算器。可以这样实现。
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;
}