小谈设计模式(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() 方法,输出相应的图形。

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

优缺点

优点

可扩展性

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

可维护性

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

可复用性

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

高内聚低耦合

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

缺点

抽象设计的复杂性

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

需要预留扩展点

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

可能引入过度设计

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程第一次作业参考答案

题目 名词解释&#xff1a;软件危机、软件、软件工程、软件生命周期、瀑布模型、原型模型、增量模型、喷泉模型、敏捷过程模型。 答案 软件危机&#xff1a;软件危机是指在软件开发过程中所面临的一系列问题和挑战&#xff0c;包括成本超支、进度延误、质量不达标等。 软件…

ubuntu 22.04 服务器网卡无IP地址

ssh连接服务器连接不上&#xff0c;提示如下&#xff1b; 连接显示器&#xff0c;ip addr ls 命令查看IP地址&#xff0c;有网卡但没有IP地址 solution&#xff1a; sudo dhclient enp10s0用于通过 DHCP 协议获取网络配置信息并为名为 enp10s0 的网络接口分配 IP 地址,enp1…

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布&#xff0c;相信很多同学都已经抢先使用了起来&#xff0c;甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性&#xff0c;新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线…

一个热爱自动驾驶但妥妥外行之人的思考-2023

时间节点为2023年9月&#xff0c;有效期当下及过往&#xff0c;不含未来。 这些年准确说从10年就很关注自动驾驶行业&#xff0c;包括物流/机器人/汽车等。 也和行业内&#xff0c;行业外的朋友做了大量的交流。点滴沟通放在如下链接中&#xff1a; 动态 - CSDN 一些过去的观…

新型智慧公厕“1+3+N”架构,平台、系统、应用的创新

近年来&#xff0c;随着人民生活水平的提高&#xff0c;人们对公共设施的要求也越来越高。其中&#xff0c;如厕问题一直是人们关注的焦点&#xff0c;但传统的公厕设施已经不能满足人们对干净、舒适、安全的需求&#xff0c;这促使了新型智慧公厕的诞生与应用&#xff0c;以如…

八月份跳槽了,历经华为测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试华为的测试开发工程师的时候&#xff0c;灵魂拷问三小…

c++ 纯虚函数、抽象类

一、 纯虚函数 抽象类 只要有一个纯虚函数&#xff0c;这个类称为抽象类 抽象类的特点 1、无法实例化 2、抽象类的子类&#xff0c;必须要重写父类中的纯虚函数&#xff0c;否者也属于抽象类 例子一 #include <iostream> #include <string.h> using namespa…

MySQL数据库详解 三:索引、事务和存储引擎

文章目录 1. 索引1.1 索引的概念1.2 索引的作用1.3 如何实现索引1.4 索引的缺点1.5 建立索引的原则依据1.6 索引的分类和创建1.6.1 普通索引1.6.2 唯一索引1.6.3 主键索引1.6.4 组合索引1.6.5 全文索引 1.7 查看索引1.8 删除索引 2. 事务2.1 事务的概念2.2 事务的ACID特性2.2.1…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录&#xff1a; App 文件夹&#xff1a;用于存放外设驱动文件&#xff0c;如 LED、数码管、定时器等。 Obj 文件夹&#xff1a;用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

蓝桥杯 题库 简单 每日十题 day3

01 约数个数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 1200000 有多少个约数&#xff08;只计算正约数&#xff09;。 解题思路 枚举&#xff0c;从1开始一直到1200000本身都作为1200000的除数&#xff0c;…

Spring 6.0 新特性

文章目录 Spring的发展历史AOTGraalVMSpringBoot实战AOTRuntimeHints案例分析RuntimeHintsRegistrar SpringBoot中AOT核心代码 Spring的发展历史 AOT Spring 6.0的新特性Ahead of Time&#xff08;AOT&#xff09;编译是一种技术&#xff0c;可以提前将Spring应用程序编译成原…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

Direct3D融合技术

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成&#xff0c;即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合)&#xff0c;利用该技术我们可得到各种各样的效果&#xff0c;尤其是透明效果。 在融合…

云渲染是怎么做到不排队的

云渲染排队严重影响了用户的使用体验&#xff0c;还会导致用户的流失&#xff0c;因此解决渲染不排队的问题对于云渲染平台来说是非常重要的。而作为云渲染平台&#xff0c;自己的机器基本都是固定的&#xff0c;哪如何解决用户渲染排队的问题呢&#xff1f;我们一起来看看全国…

天地图绘制区域图层

背景&#xff1a; 业务方要求将 原效果图 参考效果图 最终实现效果 变更点&#xff1a; 1.将原有的高德地图改为天地图 2.呈现形式修改&#xff1a;加两层遮罩&#xff1a;半透明遮罩层mask区域覆盖物mask 实现过程&#xff1a; 1.更换地图引入源 <link rel"style…

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令&#xff1a;msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包&#xff0c;成功上线 命令&#xff1…

网络安全第一次作业

1、什么是防火墙 防火墙是一种网络安全系统&#xff0c;它根据预先确定的安全规则监视和控制传入和传出的网络流量。其主要目的是阻止对计算机或网络的未经授权的访问&#xff0c;同时允许合法通信通过。 防火墙可以在硬件、软件或两者的组合中实现&#xff0c;并且可以配置为根…

西部数据硬盘查询

保修状态 | WD 支持 保修状态 | WD 支持 https://support-cn.wd.com/app/warrantystatusweb https://support-cn.wd.com/app/warrantystatusweb 选择大陆

【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

文章目录 1. unordered_map的介绍2. unordered_map的使用2.1unordered_map的构造函数2.2unordered_map的迭代器2.3unordered_map的容量和访问函数2.4unordered_map的增删查改函数 1. unordered_map的介绍 unordered_map的介绍 &#xff08;1&#xff09;unordered_map是存储&l…

Vue路由与node.js环境搭建

目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…