软件实体(类、模块、函数等等)应该是可以扩展的,但是应该是不可修改的。
说明:开放封闭原则是指对扩展开放,当应用的需求更改时,可以对模块进行扩展;封闭是指对更改是封闭的,不改动原有的列库。
关键:抽象
创建出固定却能够描述一组任意个可能行为的抽象体,抽象体为抽象基类。模块操作一个抽象体,由于模块依赖于一个特定的抽象体,所以对于它的更改是可以关闭的,同时,通过此抽象体派生,可以扩展模块行为。
比如:
下图展示了一个简单不遵循OCP原则的设计,Person和Rose都是具体类,Person类使用具体类。如果我们现在希望Person能够使用其他Flower类,就必须把Person中使用Rose的地方换成其他类。
现在将设计进行重新设计成如下,Person类使用FlowerInterface接口,不同的Flower类可以实现该接口,这种情况下就不用修改Person类。FlowerInterface描述行为,由具体类去实现它们。
接下来会通过具体的代码示例进行描述开放封闭原则:
现在需要在一个标准的GUI上绘制圆和正方形,下面对它违反OCP原则以及遵循OCP原则的部分核心代码进行展示。
违反OCP原则:
case square:
drawSquare();
break;
case circle:
drawCircle();
break;
在应用程序中通过switch语句去选择绘制图形的操作,现在若是添加一个新类型,如何更改此应用程序。
遵循OCP原则:
void draw(Vector<Shape> shapes){
Iterator it = (Iterator)shapes;
while (iterator.hasNext()){
iterator.next().draw();
}
}
在这里增加一个其他形状,不需要修改此函数。
OCP原则的关键在于寻找合适的抽象,一个应用程序可能做不到完全封闭,所以需要有选择性地进行抽象。