介绍
- 对扩展是开放的,对修改是关闭的(用抽象去构建框架,用实现扩展细节)。
- 当软件发生变化是,尽量扩展实体行为来发生变化,而不是通过修改已有代码来产生变化
案例
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;
}
}
如果需要增加一个圆形,name需要修改下面这段代码,但是根据开闭原则,这对修改时候关闭,的所以他不符合开闭原则
public void drawShape(Shape s) {
if (s.m_type==1)
drawRectangle(s);
else if (s.m_type==2)
drawCircle(s);
}
可以是他继承一个相同的类。从而达到扩展是开放的。
class GraphicEditor {
public void drawShape(Shape s) {
s.draw();
}
}
class Shape {
abstract void draw();
}
class Rectangle extends Shape {
public void draw() {
}
}