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

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

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

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 开放封闭原则
    • 核心思想
      • 关键词概括
        • 扩展
        • 封闭
      • 解释
        • 抽象和接口
        • 多态
    • 代码示例
      • 代码解释
    • 优缺点
      • 优点
        • 可扩展性
        • 可维护性
        • 可复用性
        • 高内聚低耦合
      • 缺点
        • 抽象设计的复杂性
        • 需要预留扩展点
        • 可能引入过度设计
    • 总结

专栏介绍

专栏地址

link

专栏介绍

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

开放封闭原则

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

核心思想

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

关键词概括

扩展

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

封闭

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

解释

抽象和接口

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

多态

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

代码示例

// 定义一个接口
public interface Shape {void draw();
}// 定义一个实现类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}// 定义一个扩展类
public class Rectangle implements Shape {@Overridepublic 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() 方法,输出相应的图形。

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

优缺点

优点

可扩展性

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

可维护性

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

可复用性

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

高内聚低耦合

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

缺点

抽象设计的复杂性

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

需要预留扩展点

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

可能引入过度设计

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

总结

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

相关文章:

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

小谈设计模式&#xff08;5&#xff09;—开放封闭原则 专栏介绍专栏地址专栏介绍 开放封闭原则核心思想关键词概括扩展封闭 解释抽象和接口多态 代码示例代码解释 优缺点优点可扩展性可维护性可复用性高内聚低耦合 缺点抽象设计的复杂性需要预留扩展点可能引入过度设计 总结 专…...

计算机视觉与深度学习-全连接神经网络-训练过程-欠拟合、过拟合和Dropout- [北邮鲁鹏]

目录标题 机器学习的根本问题过拟合overfitting泛化能力差。应对过拟合最优方案次优方案调节模型大小约束模型权重&#xff0c;即权重正则化(常用的有L1、L2正则化)L1 正则化L2 正则化对异常值的敏感性随机失活(Dropout)随机失活的问题 欠拟合 机器学习的根本问题 机器学习的根…...

SwiftUI Swift iOS iPadOS 实现更改 App 图标

Xcode: 14.3.1 更改 App 图标 淘宝&#xff0c;支付宝&#xff0c;有道翻译有时候会随着运营活动去调整图标&#xff0c;比如 双 11。&#xff08;这个很简单&#xff0c;替换一下 AppIcon 就可以了&#xff09;Github App 提供了多套图标可以修改。&#xff08;需要配置 &…...

Java————List

一 、顺序表和链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c; 常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…...

uniapp 触底加载

方式一 onReachBottomDistance 缺点&#xff1a;需要整个页面滑动&#xff0c;局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…...

大模型赛道如何实现华丽的弯道超车

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…...

CAN总线物理层

本文的目的并不是为了介绍或普及CAN总线相关知识,而是为了了解CAN总线,进而为CAN通信一致性测试做知识储备。 CAN,控制器局域网,全称:Controller Area Network。1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量…...

中兴面试-Java开发

1、Springboot框架&#xff0c;yarn是怎么配置的 Spring Boot 本身没有直接的配置或集成与 YARN (Yet Another Resource Negotiator) 的特性&#xff0c;YARN是Hadoop的一个资源管理和作业调度平台。如果你想在 YARN 上运行Spring Boot应用&#xff0c;你需要考虑将你的Spring…...

浅谈 React 与 Vue 更新机制的差异

前言 哈喽&#xff0c;大家好&#xff0c;我是 Baker &#xff01;&#x1f389; 对于前端的 Vue 和 React 相信大家并不陌生&#xff0c;这两个库有着截然不同的设计思想和发展目标&#xff0c;对于我们上层使用者来说&#xff0c;研究它们的差异不仅让我们更加深入的去理解…...

Delft3D水动力与泥沙运动模拟实践技术应用

水体中泥沙运动是关系到防洪&#xff0c;调水等方面的重要问题&#xff0c;也是水利和水环境领域科研热点之一。水利数值模型&#xff0c;在环境影响评价、防洪规划等方面也有着广泛的应用。荷兰Delft研究所开发的Delft3D模型是世界上最先进的水动力之一&#xff0c;能够运用于…...

Linux 本地Yearning SQL 审核平台远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…...

Redis集群(Cluster)

1. 什么是集群 广义的集群&#xff1a;只要是多台机器&#xff0c;构成一个分布式系统&#xff0c;就可以称为一个“集群”。像前面的主从结构&#xff0c;哨兵模式都是“广义的集群”狭义的集群&#xff1a;redis提供的集群模式&#xff0c;这个集群模式主要解决存储空间不足…...

Scapy 解析 pcap 文件从HTTP流量中提取图片

Scapy 解析 pcap 文件从HTTP流量中提取图片 前言一、网络环境示例二、嗅探流量示例三、pcap 文件处理最后参考 ​ 作者&#xff1a;高玉涵 ​ 时间&#xff1a;2023.9.17 10:25 ​ 环境&#xff1a;Linux kali 5.15.0-kali3-amd64&#xff0c;Python 3.11.4&#xff0c;scapy…...

难得有个冷静的程序员发言了:纯编码开发实施的项目,失败的案例也有很多

难得有个冷静的程序员发言了&#xff1a;纯编码开发实施的项目&#xff0c;失败的案例也有很多。假如用低代码实施&#xff0c;能达到不失败或提高成功率&#xff0c;对软件开发项目交付&#xff0c;会是重大的价值。 我的观点&#xff1a;两者都可能失败&#xff0c;不同的是&…...

Leetcode.146 LRU 缓存

题目链接 Leetcode.146 LRU 缓存 mid 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 c a p a c i t y capacity capacity 初始化 LRU 缓存int get(int key) 如果关键…...

科技资讯|Canalys发布全球可穿戴腕带设备报告,智能可穿戴增长将持续

市场调查机构 Canalys 近日发布报告&#xff0c;表示 2023 年第 2 季度全球可穿戴腕带设备出货量达 4400 万台&#xff0c;同比增长了 6%。 主要归功于其亲民的价格以及消费者对价位较高的替代品仍持谨慎态度&#xff0c;基础手环市场尽管与去年同期相比有所下降&#xff0c;…...

使用https接口,无法调通接口响应不安全

网页pc使用不安全https 页面提示不安全–点击高级–跳过 接口使用部安全https 无法像页面一样可以跳过 方法&#xff1a;安装证书 还是无法响应报错不安全&#xff1a; 1、确定证书绑定ip还是域名&#xff08;ip和域名都可以绑定&#xff09; 使用的是httpsip&#xff0c;报…...

uniapp开发h5,解决项目启动时,Network: unavailable问题

网上搜了很多&#xff0c;发现都说是要禁用掉电脑多余的网卡&#xff0c;这方法我试了没有好&#xff0c;不晓得为啥子&#xff0c;之后在网上看&#xff0c;uniapp的devServer vue2的话对标的就是webpack4的devserver&#xff08;除了复杂的函数配置项&#xff09;&#xff0c…...

9.17 校招 实习 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 一汽与Mobileye 签署战略合作&#xff0c;小鹏汽车将用经销商销售逐渐替换直营模式&#xff0c;原小鹏汽车副总裁加盟赛力斯 自动驾驶一周资讯 - 一汽与Mobileye 签署战…...

【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:新增查看历史记录窗口!语音播报功能!修复预览文件按钮等之前版本的bug!

文章目录 前言一、实现思路二、关键代码查看历史记录按钮语音播报按钮三、完整代码总结前言 老生常谈,先看效果:(订阅专栏可获取完整代码) 初始状态下,我们为除了【设置】外的按钮添加弹窗,提示用户在使用工具之前要先【设置】。在设置界面,我们主要修改了【预览文件】…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...