一、概述
软件实体应该是可以扩展的,但是是不可以修改的。
-
对于扩展是开放的(Open for extension)。
模块的行为是可以扩展的,当需求改变时,可以对模块进行扩展,适应新的需求。
-
对于修改是封闭的(Close for modification)。
对模块进行扩展时,不必改动模块的源代码或二进制代码。
二、举例
1、
Client 和 Server 都是具体类,Client 使用 Server。如果我们现在希望 Client 对象使用另一种不同的 Server 就必须修改 Client 把 Server 替换掉。
从 Server 类中抽象出一个接口,现在 Client 类使用这个接口,如果 Client 想使用一个新的 Server,只需要从接口中派生出一个新类。
2、
interface Shape {
void draw();
}
class Circle implements Shape {
void draw() {
System.out.println("draw a circle");
}
}
class Square implements Shape {
void draw() {
System.out.println("draw a Square");
}
}
class TestShape {
public static void main(String[] args) {
List<Shape> shapes = new ArrayList<Shape>();
for(Shape shape: shapes) {
shape.draw();
}
}
}