定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
对扩展开放,意思就是可以对类、模块和函数添加新的功能。
对修改关闭,意思就是扩展时最好不要修改原来的类和函数等。
先是一个不好的例子:
class GraphicEditor {
public void drawShape(Shape s) {
if (s.m_type==1)
drawRectangle(s);
else if (s.m_type==2)
drawCircle(s);
}
public void drawCircle(Circle r) {....}
public void drawRectangle(Rectangle r) {....}
}
class Shape {
int m_type;
}
class Rectangle extends Shape {
Rectangle() {
super.m_type=1;
}
}
class Circle extends Shape {
Circle() {
super.m_type=2;
}
}
当我们要扩展一个形状时,需要先了解GraphicEditor类,然后在drawShape中添加新的类型,然后再添加函数。下面是改进后的代码:
class GraphicEditor {
public void drawShape(Shape s) {
s.draw();
}
}
class Shape {
abstract void draw();
}
class Rectangle extends Shape {
public void draw() {
// draw the rectangle
}
}
不需要了解绘制逻辑,把具体实现放到了子类。
总结:
1. 遵守开闭原则可以提高软件扩展性和维护性。
2. 大部分的设计模式和设计原则都是在实现开闭原则。