当前位置: 首页 > 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!

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

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...