** OCP:开放-封闭原则:**
软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。
OCP建议我们应该对系统进行重构,这样以后对系统再进行同样的改动时,就不会导致更多的修改。如果正确地应用OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码。
遵循开放-封闭原则设计出的模块具有两个主要的特征:
1.对于扩展是开放的(open for extension).
2.对于修改是封闭的(close for modification).
如何做到了?:抽象
遵循OCP的Shape程序代码如下:
public interface Shape {
void draw();
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("draw a square");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("draw a circle");
}
}
public class DrawAllShapes {
public static void main(String[] args) {
ArrayList<Shape> shapes=new ArrayList<>();
shapes.add(new Square());
shapes.add(new Circle());
drawAllShapes(shapes);
}
static void drawAllShapes(List<Shape> shapes) {
for (Shape shape : shapes) {
shape.draw();
}
}
}
如果我们想要扩展drawAllShapes函数的行为:绘制一种新的形状,我们之需要增加一个新的实现Shape接口的派生类即可,而drawAllShapes函数并不需要改变。
OCP背后的主要机制是抽象和多态