当前位置: 首页 > news >正文

【Java 设计模式】设计原则之开放封闭原则

文章目录

    • 1. 定义
    • 2. 好处
    • 3. 应用
    • 4. 示例
    • 结语

在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。
这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。

✨单一职责原则(SRP)
✨开放/封闭原则(OCP)
✨里氏替换原则(LSP)
✨依赖倒置原则(DIP)
✨接口隔离原则(ISP)
✨合成/聚合复用原则(CARP)
✨迪米特法则(LoD)

在面向对象设计中,开放/封闭原则是一个基础且重要的设计原则。它强调软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。在本文中,我们将深入研究开放/封闭原则,了解它的定义、背后的理念以及如何在实际开发中应用。

1. 定义

开放/封闭原则是由伯特兰·梅耶尔(Bertrand Meyer)首次提出的,它规定软件实体应该是可以扩展的,但是不可修改的。换句话说,一个模块的行为应该可以通过扩展来进行改变,而不是通过修改已有的代码。这有助于保持系统的稳定性,减少对已有代码的影响。

2. 好处

开放/封闭原则有助于提高代码的可维护性、可读性和可扩展性。以下是一些应用开放/封闭原则的好处:

  • 降低风险:

    当系统需要变化时,通过扩展而不是修改已有的代码,降低了引入错误的风险,减少了对系统稳定性的影响。

  • 可维护性:

    通过保持现有代码的稳定性,使得系统更容易维护。开发人员可以更专注于新功能的开发,而不必担心影响到其他部分。

  • 可复用性:

    通过遵循开放/封闭原则,代码更容易被其他模块或项目重用,因为现有的功能不会随着变化而失效。

  • 可测试性:

    模块的行为通过扩展而不是修改,使得单元测试更容易编写,测试代码覆盖更全面。

3. 应用

在应用开放/封闭原则时,我们可以考虑以下几个方面:

  • 使用抽象类和接口:

    使用抽象类和接口定义一组规范,然后通过实现这些规范来进行扩展。这有助于确保扩展时不会修改现有的代码。

  • 使用设计模式:

    一些设计模式,如策略模式、观察者模式等,都是遵循开放/封闭原则的典型实现。它们提供了一种灵活的方式来添加新的功能,而不需要修改现有的代码。

  • 遵循依赖倒置原则:

    依赖倒置原则是开放/封闭原则的基石之一。通过依赖注入等方式,确保高层模块不依赖于低层模块的具体实现,而是依赖于抽象。

4. 示例

假设我们有一个图形绘制框架,其中有一个 Shape 类用于表示不同形状的图形。现在我们希望在框架中添加一个新的形状,例如矩形。如果我们遵循开放/封闭原则,我们不应该直接修改 Shape 类,而是应该通过扩展的方式添加新的形状。

Shape.java

package com.cheney.demo;public abstract class Shape {public abstract void draw();
}

Circle.java

package com.cheney.demo;public class Circle extends Shape {@Overridepublic void draw() {System.out.println("画一个圆");}
}

Rectangle.java

package com.cheney.demo;public class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("画一个长方形");}
}

通过创建新的 Rectangle 类,我们扩展了图形绘制框架而不修改现有的代码。这符合开放/封闭原则的要求。

结语

开放/封闭原则是面向对象设计中一个基础而重要的原则,它有助于创建稳定、可维护、可扩展的代码。通过遵循这一原则,我们可以更容易地适应变化,减少系统的复杂性,并提高代码的质量。在实际项目中,开发人员应该时刻关注如何设计代码以符合开放/封闭原则,从而创建更加灵活和可维护的软件。

相关文章:

【Java 设计模式】设计原则之开放封闭原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则&#xff08…...

数据分析求职-知识脑图

今天和大家聊聊数据分析求职常见面试题,这是这个系列的第一篇文章,但是我不想开始就直接罗列题目,因为这样的文章实在太多了,同学们的兴趣程度肯定一般。所以,我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…...

SQL-修改数据

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…...

Rockchip | FIQ-Debugger调试工具

FIQ-Debugger fiq debugger是集成到内核中的一种系统调试手段。 FIQ在arm架构中相当于nmi中断,fiq debugger把串口注册成fiq中断,在串口fiq中断服务程序中集成了一些系统调试命令。 一般情况下串口是普通的console模式,在串口工具下键盘输入…...

第二百六十三回 给geolocator插件提交问题

文章目录 1. 知识回顾2. 问题描述与解决2.1 问题描述2.2 问题解决 3. 心得与感受 1. 知识回顾 我们在前面章回中介绍过如何获取位置信息,主要介绍的是geolocator这个三方包,不过在最近使用时却发现了问题,尝试搜索解决,但是没有结…...

分组背包问题

题目来源:9. 分组背包问题 - AcWing题库 题目: 有 N 组物品和一个容量是 V 的背包。 每组物品有若干个,同一组内的物品最多只能选一个。 每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。 …...

WinForm 中Label自动换行 解决方法

Label自动换行 1.单行完全显示:Label.AutoSize true; 2.换行显示:Label. AutoSize false;(Label框高度用户指定)。 3.多行显示 根据字数自动控制高度:Label.AutoSize true;Label.MaximumSize new Size(w,0); …...

【蓝桥杯软件赛 零基础备赛20周】第7周——二叉树

文章目录 1 二叉树概念2 二叉树的存储和编码2.1 二叉树的存储方法2.2 二叉树存储的编码实现2.3 二叉树的极简存储方法 3 例题4 习题 前面介绍的数据结构数组、队列、栈,都是线性的,它们存储数据的方式是把相同类型的数据按顺序一个接一个串在一起。简单的…...

SpringBoot+SSM项目实战 苍穹外卖(12) Apache POI

继续上一节的内容,本节是苍穹外卖后端开发的最后一节,本节学习Apache POI,完成工作台、数据导出功能。 目录 工作台Apache POI入门案例 导出运营数据Excel报表 工作台 工作台是系统运营的数据看板,并提供快捷操作入口&#xff0c…...

Maven 基础总结篇

Maven 基础总结篇 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构:用于解决不同IDE(例如eclipse与IDEA)不同的项目结构的问题 提供了一套标准化的构建流程(编译&…...

MySQL的导入导出及备份

一.准备导入之前 二.navicat导入导出 ​编辑 三.MySQLdump命令导入导出 四.load data file命令的导入导出 五.远程备份 六. 思维导图 一.准备导入之前 需要注意: 在导出和导入之前,确保你有足够的权限。在进行导入操作之前,确保目标数据…...

【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…...

@KafkaListener指定kafka集群

基于KafkaListener注解的kafka监听代码可以手动指定要消费的kafka集群,这对于需要访问多套kafka集群的程序来说,是有效的解决方案。这里需要注意的是,此时的消费者配置信息需使用原生kafka的配置信息格式(如:ConsumerC…...

什么是算法的空间复杂度?

一、问题 常常⽤算法的空间复杂度来评价算法的性能,那么什么是算法的空间复杂度呢? 二、解答 算法的空间复杂度是指在算法的执⾏过程中,需要的辅助空间数量。 辅助空间数量指的不是程序指令、常数、指针等所需要的存储空间,也不是…...

WebDav协议相关软件@简单配置局域网内的http和WebDav服务器和传输系统

文章目录 相关软件windows自带第三方软件 chfs(CuteHttpFileServer)下载软件GUI方案 补充命令行方案命令行程序定位简单创建服务站点使用配置文件配置细节 使用软连接或符号链接等手段将向共享站点的根目录添加文件开机自启服务包装nssm包装使用powershell包装 服务启动chfs服务…...

自定义数据实现SA3D

SA3D:Segment Anything in 3D with NeRFs 实现了3D目标分割 原理是利用SAM(segment anything) 模型和Nerf分割渲染3D目标, SAM只能分块,是没有语义标签的,如何做到语义连续? SA3D中用了self-prompt, 根据前一帧的mask…...

设计模式基础概念:探索设计模式的魅力

设计模式是软件开发中的一种指导性概念,它提供了一套被广泛接受的解决方案,用于常见的设计问题。设计模式有助于提高软件的可重用性、可扩展性和可维护性,并促进团队之间的沟通。 以下是一些常见的设计模式: 创建型模式&#xff1…...

【Leetcode】2182. 构造限制重复的字符串

文章目录 题目思路代码 题目 2182. 构造限制重复的字符串 问题:给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全…...

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …...

设置弹窗随鼠标位置移动

1.这是要移动的弹窗&#xff0c;隐藏显示逻辑、样式、展示内容自己写&#xff0c;主要就是动态设置弹窗的style&#xff0c;floatLeft和floatTop都是Vue中的data双向绑定数据&#xff1b; <div id"box" v-show"hasMove" :style"{ left: floatLeft…...

告别单行输入:在Python IDLE Shell中轻松编辑多行代码的完整指南

告别单行输入&#xff1a;在Python IDLE Shell中轻松编辑多行代码的完整指南 对于Python初学者来说&#xff0c;IDLE Shell是一个既熟悉又陌生的存在。熟悉是因为它随Python安装包默认提供&#xff0c;陌生则源于大多数人仅将其视为简单的交互式命令行工具。实际上&#xff0c;…...

Ludusavi完整指南:如何专业备份和管理PC游戏存档

Ludusavi完整指南&#xff1a;如何专业备份和管理PC游戏存档 【免费下载链接】ludusavi Backup tool for PC game saves 项目地址: https://gitcode.com/gh_mirrors/lu/ludusavi Ludusavi是一款基于Rust语言开发的跨平台PC游戏存档备份工具&#xff0c;专为保护玩家游戏…...

华为MateBook D14安装Ubuntu16避坑指南:WiFi/蓝牙/触控板驱动一键搞定

华为MateBook D14安装Ubuntu 16.04驱动优化全攻略 华为MateBook D14作为一款高性价比轻薄本&#xff0c;在安装Ubuntu 16.04时可能会遇到WiFi、蓝牙和触控板驱动不兼容的问题。这主要源于硬件迭代速度远超Linux内核更新周期——你的笔记本搭载了新一代无线网卡和输入设备&#…...

全格式文档智能处理:AnythingLLM的多模态知识管理解决方案

全格式文档智能处理&#xff1a;AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08…...

AI Agent 的动态知识更新:保持 LLM 知识的实时性

AI Agent 的动态知识更新:保持 LLM 知识的实时性 关键词:AI Agent、动态知识更新、大语言模型(LLM)、实时性、知识图谱 摘要:本文聚焦于 AI Agent 的动态知识更新,旨在探讨如何保持大语言模型(LLM)知识的实时性。首先介绍了相关背景,包括目的、预期读者等。接着阐述了…...

IntelliJ Conf:JetBrains Koog Java原生AI Agent框架实战

文章目录前言&#xff1a;Java程序员的"Agent焦虑"终于有解了认识Koog&#xff1a;不是又一个LangChain的Java版环境准备&#xff1a;5分钟让项目跑起来实战&#xff1a;从Hello World到智能客服第一步&#xff1a;定义工具&#xff08;Tool&#xff09;第二步&#…...

企业Exchange邮箱配置失败?可能是Autodiscover服务出了问题,教你用微软官方工具排查

企业Exchange邮箱自动配置故障深度排查指南 引言 当企业用户或IT管理员遇到Outlook无法自动配置Exchange邮箱的问题时&#xff0c;往往意味着Autodiscover服务出现了异常。作为Exchange生态系统的核心组件&#xff0c;Autodiscover服务负责在客户端与服务器之间建立初始连接通…...

Win11Debloat:一键清理Windows 11,让你的电脑重回清爽状态

Win11Debloat&#xff1a;一键清理Windows 11&#xff0c;让你的电脑重回清爽状态 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其…...

实测才敢推 AI论文工具推荐:2026最新测评与使用体验

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...

IPD实战指南:CBB模块化设计如何加速产品创新与资源整合

1. CBB模块化设计的本质与价值 第一次接触CBB这个概念时&#xff0c;我正负责一款智能家居产品的研发。当时团队为了赶进度&#xff0c;每个新产品都从零开始设计电路板&#xff0c;结果发现80%的功能模块都是重复的。这种低效的开发方式让我开始思考&#xff1a;能不能像搭积木…...