軟體實體(類、模組、函數)應對擴展開放,對修改關閉。
意指:新增功能通過擴展(繼承、實現介面、組合)實現,而非修改既有代碼。
class GraphicEditor {
public void drawShape(Shape s) {
if (s.type == 1) drawRectangle(s);
else if (s.type == 2) drawCircle(s);
// 新增形狀必須修改此類 → 違反 OCP
}
}
class Shape { int type; }
class Rectangle extends Shape { Rectangle() { type = 1; } }
class Circle extends Shape { Circle() { type = 2; } }
abstract class Shape {
abstract void draw(); // 契約
}
class Rectangle extends Shape {
public void draw() { /* 畫矩形 */ }
}
class Circle extends Shape {
public void draw() { /* 畫圓 */ }
}
class GraphicEditor {
public void drawShape(Shape s) { s.draw(); } // 永不修改
}
新增三角形只需新增 Triangle extends Shape,GraphicEditor 零修改。
絕大多數設計模式(策略、模板方法、裝飾者、觀察者、工廠、適配器……)都是為了在不同維度滿足 OCP。