首页 > 其他分享 >设计模式六大原则之:开闭原则

设计模式六大原则之:开闭原则

时间:2024-08-17 23:22:38浏览次数:12  
标签:原则 代码 开闭 修改 抽象 软件 设计模式

1. 开闭原则简介

开闭原则(Open Closed Principle, OCP)‌是面向对象程序设计(OOP)中的一个基本原则,也是软件工程中的一项重要原则。它的核心思想是:一个软件实体(如类、模块或函数)应该对扩展开放,即当需求变化时,可以通过添加新的代码进行扩展来满足新的需求,而不需要修改现有的代码。同时,它应该是对修改封闭的,即一旦软件实体被设计完成并经过测试,就应该保持其稳定性,避免不必要的修改,以减少出错的可能性并保证软件的质量。

2. 开闭原则历史

开闭原则的历史可以追溯到伯特兰·迈耶(Bertrand Meyer)在1988年的著作《面向对象软件构造》中提出的梅耶开闭原则。随后,在20世纪90年代,随着抽象化接口的使用,开闭原则被广泛重新定义,形成了多态开闭原则,强调通过继承抽象基类来实现扩展,进一步强调了软件设计应尽量通过扩展来实现功能增加,而不是通过修改现有代码。

总的来说,开闭原则是软件设计中的一个基本原则,它指导我们如何设计可扩展且可维护的软件系统。通过遵循这一原则,可以在需求变化时保持软件的稳定性和可维护性,同时提高软件的质量和开发效率‌。

3. 开闭原则关键角色概念

  1. 抽象化设计‌:通过抽象化设计,可以将具体的实现细节隐藏在抽象接口之后,保护现有的代码不被修改。同时,抽象化设计可以提高代码的可重用性和可维护性。

  2. 模块化设计‌:通过模块化设计,可以将系统划分为多个独立的模块,每个模块都有明确的职责和功能。这样可以降低系统的耦合度,提高系统的可维护性和可扩展性。

  3. 继承和多态‌:通过继承和多态等机制,可以实现对扩展开放。具体来说,可以通过创建新的类来继承已有的类,并在新类中添加新的功能或行为,从而实现扩展。

4. 开闭原则应用场景

开闭原则是软件设计中的一个重要原则,它指导我们如何在不修改已有代码的情况下,通过扩展来适应新的需求变化,从而提高软件的质量和可维护性‌

开闭原则的应用场景主要体现在以下几个方面:

4.1 抽象与实现分离‌

通过将变化的部分抽象化,如定义接口或抽象类,然后提供具体的实现类来适应不同的需求变化。这样,当需求变化时,只需要添加新的实现类,而不需要修改原有的代码。

4.2 ‌设计模式的应用‌

例如,模板方法模式和策略模式,这些模式允许在不修改原有代码的情况下,通过继承或组合的方式增加新的行为或功能。

4.3 ‌软件架构优化‌

在软件架构设计中,遵循开闭原则可以帮助设计出更加灵活和可扩展的系统结构,从而提高软件的可维护性和适应性。

‌4.4 代码重构‌

对于已经存在的代码库,可以通过应用开闭原则进行重构,将变化的部分抽象出来,形成接口或抽象类,从而减少代码的耦合度,提高系统的可扩展性。

3.5 ‌模块化设计‌

通过模块化设计,将不同的功能模块化,每个模块内部的变化不会影响到其他模块,从而实现系统的可扩展性。

5. 开闭原则优缺点

开闭原则‌是设计模式中的一个重要原则,旨在通过抽象构建框架来提高软件的可复用性、可拓展性和可维护性。但它具有巨大优点的同时,也存在一定的缺点。

5.1 开闭原则优点

  1. 提高软件实体的可复用性‌:通过抽象构建的框架,可以避免重复定义或编码,从而提高软件实体的可复用性。
  2. 提高软件实体的可拓展性‌:基于抽象框架进行功能拓展,不需要修改原来的代码即可完成拓展,提高了软件的灵活性。
  3. 提高软件实体的可维护性‌:所有功能特性都是基于抽象框架拓展而成,各个功能特性独立且相互不影响,后期维护目标明确且方便。

5.2 开闭原则缺点

  1. 面向对象的抽象难度大‌:使用抽象构建框架时,需要很强的抽象能力,因为一旦抽象的基础框架发生变动,下面的拓展部分都有可能受到影响。
  2. 违反了开闭原则的某些方面‌:在某些情况下,对扩展开放(提供方)的同时,对修改关闭(使用方)可能会导致一些限制,尤其是在需要频繁修改或增加新功能时。

具体来说,开闭原则的优点在于它提供了一种机制,使得在不修改原有代码的情况下,通过继承或实现接口来添加新的功能或行为,这有助于保持系统的稳定性和灵活性。而缺点则在于,这种方法的实施需要较高的抽象能力,以及对系统架构的深入理解,否则可能会引入不必要的复杂性和维护困难‌。

6. 开闭原则相关代码示例

以下是一个简单的代码示例,演示了如何通过继承来实现开闭原则:

假设有一个NormalGood类,它表示一个普通的商品,具有idnameprice属性以及一个getPrice方法用于获取价格。我们想要添加一个折扣商品的功能,但不修改原有的NormalGood类。可以通过创建一个新的类DiscountGood来继承NormalGood类,并重写getPrice方法来实现折扣价格的计算:

public class NormalGood {
    private int id;
    private String name;
    private double price;

    // 构造函数、getter和setter方法省略...

    public double getPrice() {
        return price;
    }
}

public class DiscountGood extends NormalGood {
    public DiscountGood(int id, String name, double price) {
        super(id, name, price); // 调用父类的构造函数进行初始化
    }

    @Override
    public double getPrice() {
        return super.getPrice() * 0.5; // 实现50%的折扣
    }
}

在这个例子中,DiscountGood类通过继承NormalGood类实现了对扩展开放。我们没有修改NormalGood类的源代码,而是创建了一个新的类来添加折扣功能。这样,当需要添加更多折扣策略时,可以通过创建更多的子类来实现,而不需要修改原有的代码。这符合开闭原则的要求,即对扩展开放和对修改关闭‌

7. 总结

综上,开闭原则的实现依赖于抽象和实现的具体分离。通过定义抽象的接口或抽象类,并为这些抽象定义一套规范,可以实现系统的可扩展性。具体的实现细节则通过继承抽象类或实现接口来添加,这样当需求变化时,只需要添加新的具体实现类,而不需要修改原有的代码。这种设计方式不仅提高了软件的可维护性,还降低了代码之间的耦合度,使得软件更加灵活和可扩展

标签:原则,代码,开闭,修改,抽象,软件,设计模式
From: https://blog.csdn.net/lilinhai548/article/details/141287415

相关文章

  • 高级java每日一道面试题-2024年8月16日-设计模式篇-解释装饰者模式和代理模式的区别?
    如果有遗漏,评论区告诉我进行补充面试官:解释装饰者模式和代理模式的区别?我回答:在Java中,装饰者模式(DecoratorPattern)和代理模式(ProxyPattern)都是常用的设计模式,它们在结构上看起来有些相似,但实际上它们的目的、应用场景和实现方式存在明显的区别。下面详细解释这两种......
  • Golang使用Option设计模式优雅处理可选参数
    go语言不像其他语言函数的参数可以设置默认值以下是参考第三方库的写法packagemainimport"fmt"typeUserstruct{namestringageintidint}//Option代表可选参数typeOptionfunc(foo*User)//WithName为name字段提供一个设置器funcWithName(name......
  • 设计模式---构建者模式(Builder Pattern)
    构建者模式(BuilderPattern)是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。它允许使用相同的构建过程创建不同的表示。该模式通常用于构建复杂对象,这些对象由多个部分组成或具有多个可选属性。构建者模式的核心要素:Builder(构建者):定义构建对象的接口,声明创建部......
  • 【Java Lambda系列】新玩法,用Lambda重构设计模式
    前言前面三章通过理论+案例的方式对Lambda的描述,应该能基本上解决大家日常开发中所遇到的Lambda问题,为了更好的展现Lambda魅力,和加深巩固Lambda知识点,今天咱们讨论Lambda如何重构设计模式!关于设计模式众所周知,设计模式是一群大佬程序员将对程序设计的经验归纳总结起来的......
  • 接口隔离原则
    在介绍接口隔离原则之前我们先看下面举例说明中的第一个例子——反例一、举例说明1.反例(1)类图说明因为类图比较清晰,我们先看类图可以看出,DogPlays.java和CatPlays.java分别实现了接口PetInterface,DogPlaysUse和CatPlaysUse又分别通过该接口依赖DogPlays和Ca......
  • 高级java每日一道面试题-2024年8月15日-设计模式篇-设计模式与面向对象原则的关系是什
    如果有遗漏,评论区告诉我进行补充面试官:设计模式与面向对象原则的关系是什么?我回答:在设计模式与面向对象原则的关系中,两者紧密相连且相互促进。面向对象的原则为设计模式的形成提供了理论基础和指导思想,而设计模式则是这些原则在特定问题域中的具体实践和实现方式。下......
  • 面向对象设计原则
    面向对象设计原则总结单一职责原则(SRP)不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。一句话总结:不能为图代码量少......
  • 设计模式实战:内容管理系统的设计与实现
    系统功能需求内容创建:支持多种内容类型的创建,如文章、页面、媒体等。内容管理:提供灵活的管理策略,如按时间发布、按用户分组显示等。内容发布:根据不同的策略发布内容,如即时发布、定时发布等。设计分析建造者模式建造者模式用于创建复杂对象,通过逐步构建内容对象的各......
  • 设计模式(单例模式)
    概念单例模式(SingletonPattern)是指确保一个类在一个容器下只有一个实例存在,并提供一个全局访问点。单例模式最大的特点就是构造方法私有化。通常情况下,可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是让类自身负责保存它的唯一实例。......
  • 面试官:JDK中都用了哪些设计模式?
    设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK中都用了哪些设计模式?我按照大家比较熟悉且好理解的方式,把JDK中使用的设计模......