面向对象——开闭原则(Open-Closed Principle, OCP)
开闭原则(Open-Closed Principle, OCP) 是面向对象设计中的重要原则之一,它的核心思想是:
- 对扩展开放(Open for extension):软件实体(类、模块、函数等)应该可以扩展,以满足新的需求。
- 对修改关闭(Closed for modification):在扩展功能时,不应该修改已有的代码,而是通过新增代码来实现变化。
通俗理解
想象你经营了一家餐厅,菜单已经固定,但你想增加新菜品。
- 如果你直接修改菜单(修改已有代码),可能会影响老顾客的习惯,甚至导致错误。
- 更好的做法是:新增一个菜品(扩展代码),而不是修改现有菜单。
如何遵循开闭原则
- 使用抽象(接口或抽象类):让具体实现继承或实现抽象,而不是修改原有代码。
- 使用多态:基于抽象定义行为,不直接依赖具体实现。
- 组合优于继承:通过组合不同对象来扩展功能,而不是修改现有代码。
违反开闭原则的例子
假设我们有一个形状类 Shape
,它支持计算面积:
class Shape {String type;
}
class AreaCalculator {public double calculateArea(Shape shape) {if (shape.type.equals("circle")) {return Math.PI * 5 * 5; // 假设半径是5} else if (shape.type.equals("rectangle")) {return 10 * 5; // 假设长10宽5}return 0;}
}
问题:
- 如果要添加新的形状(比如三角形),我们必须修改
calculateArea()
方法,违反了开闭原则。
符合开闭原则的实现
我们可以使用抽象类来避免修改已有代码:
abstract class Shape {abstract double getArea();
}class Circle extends Shape {double radius;Circle(double radius) { this.radius = radius; }double getArea() { return Math.PI * radius * radius; }
}class Rectangle extends Shape {double width, height;Rectangle(double width, double height) {this.width = width;this.height = height;}double getArea() { return width * height; }
}class AreaCalculator {public double calculateArea(Shape shape) {return shape.getArea(); // 直接调用多态方法}
}
好处:
- 不修改
AreaCalculator
的代码,而是扩展Shape
,符合开闭原则。 - 如果新增
Triangle
,只需创建新类,而不影响AreaCalculator
。
总结
开闭原则的核心是:扩展功能时,不要修改已有代码,而是新增代码。
它使代码更稳定、更易维护,符合面向对象编程的设计理念。
相关文章:
面向对象——开闭原则(Open-Closed Principle, OCP)
开闭原则(Open-Closed Principle, OCP) 是面向对象设计中的重要原则之一,它的核心思想是: 对扩展开放(Open for extension):软件实体(类、模块、函数等)应该可以扩展&am…...
线程同步——读写锁
Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock&a…...
0.雷达信号
雷达信号 目录 1 常规脉冲信号 1 2 相位编码信号 2 3 线性调频信号 4 4 非线性调频信号 6 4.1 S型非线性调频信号 6 4.2 正弦调频信号 9 4.3 正切调频信号 10 5 噪声调幅干扰信号 11 6 噪声调频干扰信号 13 7 噪声调相干扰信号 15 1 常规脉冲信号 2 相位编码信号 …...
游戏引擎学习第189天
今天的回顾与计划 在昨天,我们花了一些时间来优化调试数据的收集方法,并且在调试界面中增加了一些界面代码,使得我们可以悬停在不同的元素上,查看相关信息。今天的任务是对这些数据进行更多的操作,进行一些有趣的实验…...
web3包含哪些关键技术栈,一些成功使用场景的分享
Web3的技术栈及其应用场景可归纳为以下六个核心模块,各模块均通过不同技术组合实现去中心化生态的构建: 一、关键技术栈及对应场景 区块链与共识机制 技术实现:以太坊、波场TRON等公链底层,结合PoW(工作量证明&am…...
uvm factory
UVM Factory 是验证环境中实现动态对象和组件创建的核心机制,它通过类型注册和覆盖(Override)机制,允许在不修改原有代码的情况下替换组件或事务类型,从而提升验证环境的灵活性和可重用性。以下是Factory机制的详细解析…...
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
出现“com.docker.vmnetd”将对您的电脑造成伤害的提示,通常是由于文件签名问题导致 macOS 的安全系统误判 Docker 为恶意软件。以下是解决方法: 停止相关服务并删除文件 运行以下命令停止相关服务并删除有问题的文件 停止 Docker 服务 sudo pkill ‘…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列…...
爬虫的第三天——爬动态网页
一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点: 用户交互:动态网页能够根据用户的请求而生成不同的内容。内容动态生成:数据来自数据库、API或用户输入。客户端动态渲染:浏览器…...
AI Agent 开发与传统后端开发区别?
AI Agent 开发与传统后端开发在目标、技术栈、设计模式和协作流程上存在显著差异。以下是详细对比: 一、核心目标不同 维度AI Agent 开发传统后端开发主要目标模拟人类决策、执行复杂任务处理业务逻辑、管理数据流用户交互主动感知环境、自主决策(如对话…...
python 将mkv格式视频转换成mp4格式
在Python中,可以使用moviepy库来将MKV格式的视频转换成MP4格式。moviepy是一个用于视频编辑的强大库,支持多种视频格式的处理。 from moviepy.editor import VideoFileClipdef convert_mkv_to_mp4(mkv_file_path, mp4_file_path):try:video VideoFileC…...
【入门初级篇】报表基础操作与功能介绍
【入门初级篇】报表的基本操作与功能介绍 视频要点 (1)报表组件的创建 (2)指标组件的使用:一级、二级指标操作演示 (3)表格属性设置介绍 (4)图表属性设置介绍 ࿰…...
单例模式在Python中的实现和应用
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。它的应用场景非常广泛,比如配置管理、日志记录、线程池等领域。让我们一起深入了解一下Python中如何实现单例模式吧! 单例模式的基本概念 单例…...
HarmonyOS-ArkUI Navigation (导航组件)-第一部分
导航组件主要实现页面间以及组件内部的界面跳转,支持在不同的组件间进行参数的传递,提供灵活的跳转栈操作,从而便捷的实现对不同页面的访问和复用。 我们之前学习过Tabs组件,这个组件里面也有支持跳转的方式,Navigati…...
技术速递|为 .NET 的 AI 评估解锁新的可能性
作者:Wendy Breiding 排版:Alan Wang Microsoft.Extensions.AI.Evaluations 库旨在简化将 AI 评估流程集成到应用程序中的过程。它提供了一个强大的框架,用于评估您的 AI 应用程序并自动化评估其性能。 去年11月,我们发布了该库的…...
android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
背景: 平常系统开发过程中,经常需要对一些代码进行相关追踪,这个时候很多同学会使用马哥课程讲解的android studio直接进行调试的方法,但是近期有学员朋友在群里反馈它在调试过程中无法看到方法参数的值,局部变量值&a…...
【OCR】技术
OCR图像识别 一、OCR是什么二、Python中如何实现OCR1.简单应用 三、OCR的核心步骤1.图像预处理(提高识别准确率)2.文字识别3.输出结果 四、OCR到的应用场景五、注意事项六、扩展学习 此贴用来更新在工作中遇到的一些图片解析内容 一、OCR是什么 …...
数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步
某些用户在使用数据库同步中间件PanguSync时说,我不想进行初次的全量同步,我已经源备份还原到目标库了,两边初始数据一样,想跳过初始数据,直接进行增量同步,该怎么设置。 直接上干货,按如下步骤…...
ICLR 2025|华科OVTR:首次实现端到端开放词汇多目标跟踪,刷新性能SOTA!
OVTR 是一种新型的多目标跟踪(MOT)方法,它由华中科技大学的团队提出,并发表于 ICLR 2025。该方法不仅速度快、适应性强,还能在开放词汇场景下实现零样本跟踪。本文将从背景、创新点到实验细节,全面介绍 OVT…...
个人学习编程(3-29) leetcode刷题
最后一个单词的长度: 思路:跳过末尾的空格,可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…...
JSP 与 JavaScript 动态网页开发的比较
本质区别 特性JSP (JavaServer Pages)JavaScript执行位置服务器端客户端(浏览器)主要功能生成HTML内容操作DOM、处理用户交互数据获取直接访问服务器资源(数据库等)需要通过AJAX/Fetch API获取SEO友好是(内容在服务器生成)否(内容可能由JS动态生成)首次加载完整HTML可能需要多…...
Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发
vue 开发table 列表时,需要动态调整列字段的顺序和显示隐藏 实现效果如图所示: vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…...
Apache Shiro 全面指南:从入门到高级应用
一、Shiro 概述与核心架构 1.1 什么是 Shiro? Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管…...
高速电路中的存储器应用与设计三
4 DDR2 SDRAM 介绍及其应用要点 1. DDR2 SDRAM 概述 DDR2(Double Data Rate 2,两倍数据速率,版本 2)SDRAM,是由 JEDEC 国际标准组织开发的、基于 DDR SDRAM 的、升级的存储技术。与 DDR SDRAM 相比,虽然其…...
AndroidStudio无法识别连接夜神模拟器
下载夜神模拟器: https://www.yeshen.com/ 启动之后发现AS关联不了夜神模拟器,需要做如下的操作。 1:复制配置文件进入夜神模拟器 adb 相关的更改: 开启的命令是: 端口启动 固定: 夜神模拟器ÿ…...
Go 语言标准库中database模块详细功能介绍与示例
Go语言的标准库 database/sql 提供了与 SQL 数据库交互的通用接口,但需要搭配具体的数据库驱动(如 MySQL、PostgreSQL 等)使用。以下是 database/sql 的核心方法及示例说明: 1. 连接数据库 sql.Open(driverName, dataSourceName)…...
ai-api-union项目,适配各AI厂商api
项目地址:alpbeta/ai-api-union 需求:实现兼容各大模型厂商api的流式对话和同步对话接口,本项目现兼容智谱、豆包、通义、通义版deepseek 设计 一个ChatController类对外暴露这两个接口,入参都为ChatRequest请求类,…...
进程间通信——信号量
进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…...
CSS 如何设置父元素的透明度而不影响子元素的透明度
CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度&#x…...
SpringBean模块(一)定义如何创建生命周期
一、介绍 1、简介 在 Spring 框架中,Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象,并在应用程序运行时对它们进行依赖注入(Dependency Injection,DI)。 通俗地讲,Sp…...
2007-2019年各省地方财政一般公共服务支出数据
2007-2019年各省地方财政一般公共服务支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政一般公共服务支出 4、范围:31省 5、指标说明:地方财政一般公共服务…...
S32K144外设实验(六):FTM输出单路PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK,在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出,FTM模块的功能时钟为SYS_CLK,…...
二层综合实验
拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…...
《深度剖析SQL之WHERE子句:数据过滤的艺术》
在当今数据驱动的时代,数据处理和分析能力已成为职场中至关重要的技能。SQL作为一种强大的结构化查询语言,在数据管理和分析领域占据着核心地位。而WHERE子句,作为SQL中用于数据过滤的关键组件,就像是一把精准的手术刀,…...
Python每日一题(7)
Python每日一题 2025.3.27 一、题目二、分析三、自己源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""编写程序,生成包含20个随机数的列表,然后将前十个元素升序排列,后10个元素降序排列,并输出结果""" ]二、分析 今天本来写了…...
Linux命令大全:从入门到高效运维
适合人群:Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令(每天必用) 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令(按需使用) 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…...
Xss复现
目录 前提: 1.什么是XSS 2.XSS 的三种主要类型 复现 第1关 第2关 前提: 1.什么是XSS XSS(跨站脚本攻击,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向网页注入恶意脚本ÿ…...
3.28学习总结
完成分割回文串的算法题,难点主要在如何去分割,靠什么去分割字符串 int a(char arr[]){int i,j;int lenstrlen(arr);for(i0,jlen-1;i<j;i,j--){if(arr[i]!arr[j]) return 0;}return 1;}char **path;int pathtop;char***reasult;int*ansize;int count…...
【MySQL基础】数据库及表基本操作
作为运维工程师,掌握MySQL的基础操作是日常工作的重要技能之一。本文将介绍MySQL中数据库和表的基本操作,帮助您快速上手或复习这些核心概念。 1 数据库基本操作 1.1 创建数据库 create database db_name; -- 指定字符集和排序规则 create database d…...
注意!ChatGPT 全新 AI 图像功能延迟对免费用户开放
2025 年 3 月 25 日,OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生图像生成功能。 这一功能允许用户通过对话生成和编辑图像,支持从写实风格到插图风格的多种形式。OpenAI 首席执行官萨姆・奥特曼(Sam Altman)在社…...
玛哈特液压式精密矫平机——以精准压力,定义金属的绝对服从
板材应力不除,良率难升。液压式精密矫平机,凭借多级液压闭环技术AI动态补偿算法,攻克0.2mm超薄钛箔至65mm装甲钢板的矫平极限,平整度精度锁定0.012mm,残余应力≤3MPa,让金属从“形似平整”迈向“分子级稳定…...
HCIA【NAT】
目录 1 NAT产生背景 2 NAT作用 3 NAT分类 NAT(网络地址转换技术) 1 NAT技术产生背景 [1] IPV4地址不够用 [2] 处于IPV4到IPV6的一个过渡阶段,IPV6地址还没有完全普及 2 作用 [1] 解决IP地址不够用的问题 [2] 做公网和私网地址的转换 …...
Reactor 事件流 vs. Spring 事件 (ApplicationEvent)
Reactor 事件流 vs. Spring 事件 ApplicationEvent Reactor 事件流 vs. Spring 事件 (ApplicationEvent)1️⃣ 核心区别2️⃣ Spring 事件 (ApplicationEvent)✅ 示例:Spring 事件发布 & 监听1️⃣ 定义事件2️⃣ 发布事件3️⃣ 监听事件🔹 进阶&…...
Google开源机器学习框架TensorFlow探索更多ViT优化
一、在边缘设备优化ViTa 在边缘设备上优化 ViT(Vision Transformer)模型,主要目标是减少计算量、降低功耗、提升推理速度。以下是几种关键优化策略: 1.轻量级 ViT 变体 部分 ViT 变体专为边缘设备优化,包括…...
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…...
火山dts迁移工具使用
登录后选择生态工具。(数据库传输服务DTS) 先选region 创建迁移任务 假设,mysql 选择专有网络(一般上云到火山都是专有网络) 【先选】结构迁移,全量,这些 【再选】迁移对象 (他们产研有bug,先…...
Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)
1. brew安装 mac需要先安装brew,如果本地已经安装过brew这一步可以忽略,遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败,因为…...
Go 语言标准库中time模块详细功能介绍与示例
以下是 Go 语言 time 模块的详细说明及示例,涵盖时间操作、定时器、时区处理等核心功能: 一、时间基础操作 1. 获取时间 // 当前本地时间 now : time.Now() fmt.Println(now) // 2023-08-04 15:30:45.123456 0800 CST// 构造指定时间 t : time.Date(20…...
做的一些实验
先在DRMPlane::Perform函数里,把PLANE_SET_SRC_RECT或者PLANE_SET_DST_RECT设置的DRMProperty::SRC_W DRMProperty::SRC_H或者DRMProperty::CRTC_W DRMProperty::CRTC_H设置为原来1/2,都无法启动Android界面。 后来思考了一下,Log里好像打印…...
计算机网络基础:网络流量工程与优化策略
计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…...