前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小谈设计模式(5)—开放封闭原则

小谈设计模式(5)—开放封闭原则

作者头像
学编程的小程
发布2023-10-11 16:08:58
1910
发布2023-10-11 16:08:58
举报
文章被收录于专栏:学习笔记ol
小谈设计模式(5)—开放封闭原则

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

在这里插入图片描述
在这里插入图片描述

开放封闭原则

开放封闭原则是面向对象设计中的一个重要原则,它指导我们编写可扩展、可维护和可复用的代码。

核心思想

软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,当需要增加新的功能时,应该通过扩展已有的代码来实现,而不是修改已有的代码。

关键词概括
扩展

当需求发生变化时,我们希望能够方便地增加新的功能或特性,而不需要对已有的代码进行修改。这样可以减少引入新错误的风险。

封闭

已有的代码应该是稳定的,不应该受到需求变化的影响。即使需求发生变化,我们也不应该修改已有的代码。这样可以保护已有的代码,防止引入新的错误。

解释
抽象和接口

通过定义抽象类或接口,我们可以将可变的部分抽象出来,定义一组公共的方法和属性。这样,在需要扩展时,我们只需要实现新的子类或实现新的接口即可,而不需要修改已有的代码。

多态

通过使用多态,我们可以在运行时动态地选择不同的实现。这样,我们可以通过扩展已有的类或接口来实现新的功能,而不需要修改已有的代码。

在这里插入图片描述
在这里插入图片描述

代码示例

代码语言:javascript
复制
// 定义一个接口
public interface Shape {
    void draw();
}

// 定义一个实现类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

// 定义一个扩展类
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

// 定义一个客户端类
public class Client {
    public void drawShapes(List<Shape> shapes) {
        for (Shape shape : shapes) {
            shape.draw();
        }
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Client client = new Client();
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle());
        shapes.add(new Rectangle());
        client.drawShapes(shapes);
    }
}
在这里插入图片描述
在这里插入图片描述
代码解释

在上面的代码中,我们定义了一个 Shape 接口,它有一个 draw() 方法。然后我们定义了一个实现类 Circle 和一个扩展类 Rectangle,它们都实现了 Shape 接口。

在客户端类 Client 中,我们定义了一个 drawShapes() 方法,它接受一个 List 参数,并循环调用每个 Shape 对象的 draw() 方法。这样,我们可以通过扩展 Shape 接口并实现新的子类来增加新的图形类型,而不需要修改已有的代码。

在测试代码中,我们创建了一个 Client 对象,并传入一个包含 Circle 和 Rectangle 对象的 List。然后调用 drawShapes() 方法,它会依次调用每个图形对象的 draw() 方法,输出相应的图形。

这个示例代码演示了如何使用开放封闭原则来实现代码的扩展。通过定义一个公共的接口并实现多个子类,我们可以在不修改已有的代码的情况下,扩展代码的功能。

在这里插入图片描述
在这里插入图片描述

优缺点

优点
可扩展性

开放封闭原则可以使系统具有良好的扩展性。通过定义抽象类或接口,并实现新的子类或接口,我们可以在不修改已有的代码的情况下,增加新的功能。

可维护性

开放封闭原则可以提高代码的可维护性。通过将可变的部分与稳定的部分分离开来,我们可以更容易地理解和修改代码。当需求发生变化时,我们只需要扩展已有的类或接口,而不需要修改已有的代码。

可复用性

开放封闭原则可以增加代码的可复用性。通过定义抽象类或接口,并实现新的子类或接口,我们可以将相同的代码逻辑应用于不同的场景中。

高内聚低耦合

开放封闭原则可以提高代码的内聚性和减少代码的耦合性。通过将可变的部分封装在独立的类中,并通过接口进行交互,我们可以将代码分解为独立的模块,从而提高代码的内聚性和减少代码的耦合性。

缺点
抽象设计的复杂性

开放封闭原则可能会增加代码的复杂性。通过引入抽象类或接口,我们需要定义更多的类和接口,这会增加代码的复杂性。

需要预留扩展点

开放封闭原则需要在设计时预留扩展点,这可能会增加设计的难度。如果没有正确地预留扩展点,可能需要修改已有的代码。

可能引入过度设计

开放封闭原则可能会导致过度设计。为了实现扩展性,我们可能会引入过多的抽象类和接口,这可能会增加代码的复杂性和理解难度。

在这里插入图片描述
在这里插入图片描述

总结

开放封闭原则是面向对象设计中的一个重要原则,它的核心思想是对扩展开放,对修改封闭。通过定义抽象类或接口,并实现新的子类或接口,可以在不修改已有的代码的情况下,增加新的功能。这样可以提高系统的扩展性、可维护性和可复用性,同时减少代码的耦合性和提高代码的内聚性。然而,开放封闭原则也可能增加代码的复杂性和设计难度,需要在实际应用中权衡利弊。总的来说,开放封闭原则是一种有助于构建可扩展、可维护和可复用的系统的重要原则。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 小谈设计模式(5)—开放封闭原则
  • 专栏介绍
  • 开放封闭原则
    • 核心思想
      • 关键词概括
      • 解释
    • 代码示例
      • 代码解释
    • 优缺点
      • 优点
      • 缺点
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档