SOLID 设计原则:开闭原则(OCP)
SOLID 设计中的开闭原则(OCP)指出类必须对扩展开放但对修改关闭。构建你的类,这样你就可以创建新行为而不修改原始代码。
经典示例:计算形状面积
一个经典的例子是计算形状的面积。你可以创建一个名为 AreaCalculator 的类,其中有返回矩形和圆形面积的方法。
为了计算面积,Rectangle 类有宽度和高度。Circle 只需要半径和π的值。
public class AreaCalculator {
public float GetRectangleArea(Rectangle rectangle) {
return rectangle.width * rectangle.height;
}
public float GetCircleArea(Circle circle) {
return circle.radius * circle.radius * Mathf.PI;
}
}
public class Rectangle {
public float width;
public float height;
}
public class Circle {
public float radius;
}
这工作得很好,但如果你想向 AreaCalculator 添加更多形状,你需要为每个新形状创建一个新方法。假设你想传递一个五边形或八边形怎么办?如果你需要 20 个更多的形状怎么办?AreaCalculator 类会很快失控。
你可以创建一个名为 Shape 的基类,并创建一个方法来处理形状。但是,这样做需要在逻辑内部使用多个 if 语句来处理每种类型的形状。这不会很好地扩展。
你希望对扩展开放(使用新形状的能力)而不修改原始代码(AreaCalculator 的内部)。虽然它能工作,但当前的 AreaCalculator 违反了开闭原则。
重构方案:抽象基类
我们如何设计 AreaCalculator 来接受新形状?
相反,考虑定义一个抽象 Shape 类:
public abstract class Shape {
public abstract float ();
}


