设计模式 - 浅谈开闭原则
开闭原则
原则说明:开闭原则 (The Open/Closed Principle, OCP) ,软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
为什么要遵守该原则
该原则在产品化的环境中是特别有价值的,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用品质的过程。遵循这种原则的代码在扩展时并不发生改变,只需对拓展的部分进行测试即可。
示例
假设我们有一个绘图(GraphicEditor)
的类,它可以绘制各种形状
public class GraphicEditor {
public void drawShape(Shape s) {
if (s.type == 1)
drawRectangle(s);
else if (s.type == 2)
drawCircle(s);
// and so on...
}
public void drawRectangle(Shape r) {
// ...
}
public void drawCircle(Shape r) {
// ...
}
}
public class Shape {
int type;
}
现在,如果我们想要添加一个新的形状,比如三角形,我们需要修改GraphicEditor
类,添加一个新的方法drawTriangle
,并且还需要修改drawShape
方法。这就违反了开闭原则
。
为了遵循开闭原则,我们可以这样做:
public abstract class Shape {
int type;
public abstract void draw();
}
public class Rectangle extends Shape {
Rectangle() {
super.type = 1;
}
@Override
public void draw() {
// draw the rectangle
}
}
public class Circle extends Shape {
Circle() {
super.type = 2;
}
@Override
public void draw() {
// draw the circle
}
}
public class GraphicEditor {
public void drawShape(Shape s) {
s.draw();
}
}
现在,如果我们想要添加一个新的形状,我们只需要创建一个新的类,继承Shape
,并实现draw
方法。GraphicEditor类
不需要做任何修改。
开闭原则带来的好处
- 对软件测试的影响:开闭原则 可以保持原有的代码的稳定性,我们只需要对扩展代码进行测试就可以了
- 提高代码的可复用性:代码的粒度越小,可复用性也就越高
- 提高软件可维护性:遵守 开闭原则 的软件,其稳定性和延续性较强,从而更易于扩展和维护。