开放-封闭原则


一、概述

软件实体应该是可以扩展的,但是是不可以修改的。

  • 对于扩展是开放的(Open for extension)。

    模块的行为是可以扩展的,当需求改变时,可以对模块进行扩展,适应新的需求。

  • 对于修改是封闭的(Close for modification)。

    对模块进行扩展时,不必改动模块的源代码或二进制代码。

二、举例

1、

OCP1.png

Client 和 Server 都是具体类,Client 使用 Server。如果我们现在希望 Client 对象使用另一种不同的 Server 就必须修改 Client 把 Server 替换掉。


OCP2.png

从 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();
    }
  }
}

 Toc