开放封闭原则表示一个软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,一个软件实体应该在不修改原有代码的前提下,可以扩展新的功能。
开放封闭原则是设计模式的核心原则,它体现了软件的灵活性和稳定性。如果一个软件能够满足开放封闭原则,那么它就具有以下两个优点:
举个例子,假设我们有一个计算器类 Calculator,它可以根据用户输入的表达式进行计算。最初,它只支持加法运算,代码如下:
class Calculator {
public int calculate(String expression) {
// 如果表达式是加法运算,返回计算结果
if (expression.contains("+")) {
String[] numbers = expression.split("\\+");
int result = 0;
for (String number : numbers) {
result += Integer.parseInt(number);
}
return result;
}
// 否则抛出异常
else {
throw new IllegalArgumentException("Invalid expression");
}
}
}
这个类违反了开放封闭原则,因为如果我们想要增加其他运算符,比如减法、乘法、除法等,就必须修改 calculate() 方法的逻辑,这样就会破坏原有的功能,并且增加了出错的可能性。
为了遵循开放封闭原则,我们应该将 Calculator 类设计成一个抽象类,并定义一个抽象方法 calculate()。然后,针对每一种运算符,定义一个子类来继承 Calculator 类,并实现 calculate() 方法。这样,如果我们想要增加新的运算符,只需要增加一个新的子类即可,不需要修改原有的代码。代码如下:
abstract class Calculator {
public abstract int calculate(String expression);
}
class AddCalculator extends Calculator {
@Override
public int calculate(String expression) {
// 如果表达式是加法运算,返回计算结果
if (expression.contains("+")) {
String[] numbers = expression.split("\\+");
int result = 0;
for (String number : numbers) {
result += Integer.parseInt(number);
}
return result;
}
// 否则抛出异常
else {
throw new IllegalArgumentException("Invalid expression");
}
}
}
class SubCalculator extends Calculator {
@Override
public int calculate(String expression) {
// 如果表达式是减法运算,返回计算结果
if (expression.contains("-")) {
String[] numbers = expression.split("\\-");
int result = Integer.parseInt(numbers[0]);
for (int i = 1; i < numbers.length; i++) {
result -= Integer.parseInt(numbers[i]);
}
return result;
}
// 否则抛出异常
else {
throw new IllegalArgumentException("Invalid expression");
}
}
}
// 其他运算符的子类省略