定义:软件实体应当对扩展开放,对修改关闭,即:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等,应该在不修改现有代码的基础上,去扩展新功能
开闭原则中的 开,是指对于组件功能的扩展是开放的,允许对其进行功能扩展的;开闭原则中的 闭,是指对于代码的修改是封闭的,即不应该修改原有的代码
反例代码,问题:每增加一种图形,就需要修改 GraphicEditor 类。这样就违背了对扩展开放,对修改关闭
/** * Shape 类,基类 */ class Shape { int m_type; } /** * 矩形 */ class Rectangle extends Shape { public Rectangle() { super.m_type = 1; } } /** * 圆 */ class Circle extends Shape { public Circle() { super.m_type = 2; } }
/** * 这是一个用于绘图的类 */ class GraphicEditor { // 接收 Shape 对象,然后根据 type,来绘制不同的图形 public void drawShape(Shape s) { if (s.m_type == 1) { drawRectangle(s); } else if (s.m_type == 2) { drawCircle(s); } } public void drawRectangle(Shape r) { System.out.println(" 绘制矩形 "); } public void drawCircle(Shape r) { System.out.println(" 绘制圆形 "); } }
public class Client { public static void main(String[] args) { GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); } }
修改后的代码
class GraphicEditor { // 接收Shape对象,然后根据type,来绘制不同的图形 public void drawShape(Shape s) { s.draw(); // 图形里面直接提供绘画方法 } } abstract class Shape { public abstract void draw(); } class Rectangle extends Shape { @Override public void draw() { System.out.println("绘制矩形 "); } } class Circle extends Shape { @Override public void draw() { System.out.println("绘制圆形"); } }
开闭原则的最终解决方案是面向接口编程。开闭原则是最基础的设计原则,其他设计原则都是开闭原则的具体形态,它是面向对象设计的终极目标