** 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背后的主要機制是抽象和多態