设计模式六大原则(二)-开闭原则

开闭原则(Open-Closed Principle)是面向对象设计中的一个原则,它指导我们在设计软件系统时应该对扩展开放,对修改关闭。

简而言之,开闭原则要求我们设计的模块、类、函数等应该对扩展是开放的,也就是说可以通过增加新的代码来扩展其功能,但是对于已有的代码,尽量避免修改。

开闭原则主要解决的问题是软件系统的可维护性和可扩展性。当我们的系统需要进行功能扩展或修改时,如果直接修改已有的代码,可能会引发一系列的问题,比如破坏原有功能的稳定性、引入新的bug等。而遵循开闭原则,通过扩展已有的代码,新增功能的实现可以独立于原有代码,不会对原有功能产生影响。

需要使用开闭原则的时候,通常有以下情况:

  1. 当我们需要对系统进行功能扩展时,如果直接修改已有的代码,可能会引发一系列问题,此时可以使用开闭原则来保证系统的稳定性和可维护性。
  2. 当系统需要支持新的需求或变化时,通过遵循开闭原则,我们可以通过增加新的代码来实现新的功能,而不必修改已有的代码。

假设你有一件衣服,你想要在不改变原有衣服的设计和结构的情况下增加一些装饰,比如添加一些绣花或贴纽扣。如果你直接对衣服进行修改,可能会导致衣服的破损或改变原有的外观。而如果你通过增加绣花或贴纽扣的方式来实现装饰,这样你就能保持衣服的原有设计和结构不变,同时增加了一些新的装饰。通过遵循开闭原则,你对衣服进行了扩展,而不是修改,从而保持了衣服的稳定性。

开闭原则的优点包括:

  1. 提高系统的可扩展性:通过遵循开闭原则,新增功能的实现可以独立于原有代码,不会对原有功能产生影响,从而提高了系统的可扩展性。
  2. 降低系统的维护成本:由于不需要频繁地修改已有的代码,遵循开闭原则可以降低系统的维护成本。
  3. 提高代码的复用性:通过扩展已有的代码来实现新的功能,可以重用已有的代码逻辑。

开闭原则也有一些缺点:

  1. 增加了系统的复杂性:为了遵循开闭原则,可能需要引入抽象层或设计模式,这会增加系统的复杂性。
  2. 需要合理划分扩展点:为了实现开闭原则,需要合理地划分扩展点,否则可能会导致扩展困难或扩展点不够灵活。

适合使用开闭原则的场景包括:

  1. 当系统需要支持新的需求或变化时,通过增加新的代码来实现新的功能,而不必修改已有的代码。
  2. 当我们需要对系统进行功能扩展时,通过遵循开闭原则,新增功能的实现可以独立于原有的代码,不会对原有功能产生影响。

下面是一个简单的Java代码示例,演示开闭原则的实现:

// 抽象图形类
abstract class Shape {
    public abstract void draw();
}

// 圆形类
class Circle extends Shape {
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// 矩形类
class Rectangle extends Shape {
    public void draw() {
        System.out.println("绘制矩形");
    }
}

// 绘图工具类
class DrawingTool {
    public void drawShapes(Shape[] shapes) {
        for (Shape shape : shapes) {
            shape.draw();
        }
    }
}

// 示例代码
public class Main {
    public static void main(String[] args) {
        Shape[] shapes = { new Circle(), new Rectangle() };

        DrawingTool drawingTool = new DrawingTool();
        drawingTool.drawShapes(shapes);
    }
}

在上述代码中,我们定义了一个抽象的图形类 Shape,它有一个抽象方法 draw()

然后我们派生出具体的圆形类 Circle 和矩形类 Rectangle,它们分别实现了 draw() 方法。

最后,我们有一个绘图工具类 DrawingTool,它接收一个 Shape 数组,并调用每个图形的 draw() 方法来绘制图形。

假设现在我们需要添加一个新的图形,比如三角形。

根据开闭原则,我们只需要新增一个三角形类 Triangle,并在 Main 类中将其加入到 shapes 数组中,而不需要修改已有的代码。

这样就实现了对系统的扩展,而不会对已有功能产生影响。

posted @   yu-V  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示