设计模式-原则篇-01.开闭原则
简介
可以把设计模式理解为一套比较成熟并且成体系的建筑图纸,经过多次编码检验目前看来使用效果还不错的软件设计方案。适用的场景也比较广泛,在使用具体的设计模式之前先要学习软件设计的基础 “软件设计原则”,后面的23个设计模式都是遵从“软件设计原则演变而来的”。
概念
1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
实例
业务场景:
根据用户的要求进行-字符串拼接-返回指定格式的字符串比如:字母小写转大写字母大写转小写
1、开闭原则(Open Close Principle)
不符合开闭原则示例
大小写转换类
//字符串转换
public class StringConvert {// 对字符串进行大小写转换public String convertToString(String params,String type){String result=null;if ("大写".equals(type)){result=params.toUpperCase();} else {result=params.toLowerCase();}return result;}
}
测试代码
@Testvoid contextLoads() {StringConvert convert=new StringConvert();String daxie = convert.convertToString("ksh", "大写");System.out.println("大写"+daxie);String xiaoxie = convert.convertToString(daxie, "小写");System.out.println("小写"+xiaoxie);}
测试结果
符合开闭原则示例
大小写转换类
转换接口
// 字符串转换接口
public interface StringConvert {//字母大小写转换public String convertToString(String params);
}
大写实现类
//字母转成大写实现类
public class StringConvertToUPimpl implements StringConvert {@Overridepublic String convertToString(String params) {String result = params.toUpperCase();return result;}
}
小写实现类
//字母小写转换实现类
public class StringConvertToLow implements StringConvert {@Overridepublic String convertToString(String params) {String result = params.toLowerCase();return result;}
}
测试代码
@Testvoid contextLoads1() {com.example.opencloseprinciple.demo02.StringConvert convert=new StringConvertToUPimpl();String ksh = convert.convertToString("ksh");System.out.println("大写"+ksh);com.example.opencloseprinciple.demo02.StringConvert convert1=new StringConvertToLow();String s = convert1.convertToString(ksh);System.out.println("小写"+s);}
测试结果
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/b8453ddd87ab13666e11c7748005d9e8.png)
设计模式-原则篇-01.开闭原则
简介 可以把设计模式理解为一套比较成熟并且成体系的建筑图纸,经过多次编码检验目前看来使用效果还不错的软件设计方案。适用的场景也比较广泛,在使用具体的设计模式之前先要学习软件设计的基础 “软件设计原则”,后面的23个设计模式都是…...
![](https://img-blog.csdnimg.cn/1421318507a249b1a03fdc070e5729bb.png#pic_center)
JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)
基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能: 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…...
![](https://img-blog.csdnimg.cn/6ac02949f08e4440a6611c80061066ca.png)
windows环境搭建ELK
目录 资源下载(8.9.1) ES安装、注册、使用 Kibana安装、注册、使用 Logstash安装、注册、使用 Filebeat安装、使用(如果只有一个数据流,则不需要使用filebeat,直接上logstash即可) 资源下载࿰…...
![](https://img-blog.csdnimg.cn/81a3417cfff74872819aa04a6842e183.png)
langchain介绍之-Prompt
LangChain 是一个基于语言模型开发应用程序的框架。它使得应用程序具备以下特点:1.数据感知:将语言模型与其他数据源连接起来。2.代理性:允许语言模型与其环境进行交互 LangChain 的主要价值在于:组件:用于处理语言模型…...
![](https://img-blog.csdnimg.cn/5be42e25197c4c62b074eab00fe6b8d6.png)
汇编语言Nasmide编辑软件
用来编写汇编语言源程序,Windows 记事本并不是一个好工具。同时,在命令行编译源程序也令很多人迷糊。毕竟,很多年轻的朋友都是用着 Windows 成长起来的,他们缺少在 DOS和 UNIX 下工作的经历。 我一直想找一个自己中意的汇编语言编…...
![](https://img-blog.csdnimg.cn/img_convert/a4a7d822a816bea6e004d94190876b53.png)
用python开发一个炸金花小游戏
众所周知扑克牌可谓是居家旅行、桌面交友的必备道具, 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则。 炸(诈)金花又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏…...
![](https://img-blog.csdnimg.cn/ff7805029277461898f3d879967edbc3.png)
Uniapp中使用uQRCode二维码跳转小程序页面
下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…...
![](https://img-blog.csdnimg.cn/9cff52f18e36493da36ea37037b17717.png)
解决husky在mac下不生效的问题
目录 一、问题 1.1 问题描述 二、解决 2.1 解决 一、问题 1.1 问题描述 本文主要解决的问题是,husky在windows上正常生肖,但放到mac下后不生效的问题! 为了确保团队中提交代码的一致性,因此使用了 husky 作为提交的检测工具…...
![](https://img-blog.csdnimg.cn/0964e1c9f8b54c658757719d080e374d.jpeg)
如何在自动化测试中使用MitmProxy获取数据返回?
背景介绍 当我们在接口或UI自动化项目中,常常会出现这种现象——明明是正常请求,却无法获取到想要的数据返回。 比如: 场景A:页面是动态数据,第一次进入页面获取到的数据,和下次进入页面获取到的数据完全…...
![](https://img-blog.csdnimg.cn/cf90f6e5fbad471e97e31e9cff873309.png)
达之云BI平台助力中国融通集团陕西军民服务社有限公司实现数字化运营
中国融通集团陕西军民服务社是一家大型综合类零售购物中心,公司目前管理系统运行了10年左右,面临系统新零售支持发展严重滞后,行业主流应用落地困难,如线上业务、到家业务、全渠道营销、电子发票、自助收银、扫码购、无感停车、未…...
![](https://img-blog.csdnimg.cn/e7a2a814b5ff46b58e9300fd5e3083aa.png)
Private market:借助ZK实现的任意计算的trustless交易
1. 引言 Private market,借助zk-SNARKs和以太坊来 隐私且trustlessly selling: 1)以太坊地址的私钥(ECDSA keypair)2)EdDSA签名3)Groth16 proof:借助递归性来匿名交易Groth16 proo…...
![](https://img-blog.csdnimg.cn/dd06dd9890fd4bcfaa683a0bbc6abfb1.png)
反序列化漏洞复现(typecho)
文章目录 执行phpinfogetshell 执行phpinfo 将下面这段代码复制到一个php文件,命名为typecho_1.0-14.10.10_unserialize_phpinfo.php,代码中定义的类名与typecho中的类相同,是它能识别的类: <?php class Typecho_Feed{const…...
![](https://img-blog.csdnimg.cn/f129776a66754ecf83ba054d08fdb63f.png)
QT设计一个小闹钟
设置一个闹钟,左侧窗口显示当前时间,右侧设置时间,以及控制闹钟的开关,下方显示闹钟响时的提示语。当按启动按钮时,设置时间与闹钟提示语均不可再改变。当点击停止时,关闭闹钟并重新启用设置时间与闹钟提示…...
![](https://img-blog.csdnimg.cn/f9119912d49747668383b0234a3782aa.gif)
MybatisPlus(3)
前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 一、查询投影🍭 查询投影是指在查询操作中,只选择…...
![](https://www.ngui.cc/images/no-images.jpg)
安全计算环境技术测评要求项
1.身份鉴别-在应用系统及各类型设备中确认操作者身份的过程(身份鉴别和数据保密) 1-2/2-3/3-4/4-4 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换 b)应具有…...
![](https://www.ngui.cc/images/no-images.jpg)
Excel快捷键表
工作表插入新工作表ShiftF11或AltShiftF1移动到工作簿中的下一张工作表CtrlPageDown移动到工作簿中的上一张工作表CtrlPageUp选定当前工作表和下一张工作表ShiftCtrlPageDown取消选定多张工作表Ctrl PageDown选定其他的工作表CtrlPageUp选定当前工作表和上一张工作表ShiftCtrlP…...
![](https://img-blog.csdnimg.cn/ee2303730c914679839e5d8bd9684f68.webp)
Windows Server 系统各版本及授权说明(附下载地址
本文为Windows Server系统各版本差异对比及授权说明。 会对相关目前仍主流使用的相关Windows Server系统版本和相关授权进行对比和功能说明。 WindowsServer2012 R2 Windows Server 2012 R2授权方式是按照物理CPU数量进行授权,比如物理服务器CPU插槽数量2ÿ…...
![](https://img-blog.csdnimg.cn/2bb9f11e7d574be89f40e818fe8b77c3.png)
【智慧工地源码】物联网和传感器技术在智慧工地的应用
物联网(IoT)和传感器技术在智慧工地中扮演着至关重要的角色。这些技术的应用,使得智慧工地能够实现对施工过程的精确监控、数据收集和分析,以及设备互联,从而提高工程效率、减少成本并改善工人的工作环境。 一、物联网…...
计算机安全学习笔记(IV):基于角色的访问控制 - RBAC
RBAC(Role-Based Access Control)基于用户在系统中设定的角色而不是用户的身份。一般来说,RBAC模型定义角色为组织中的一项工作职责,RBAC系统给角色而不是给单独的用户分配访问权。用户根据他们的职责被静态地或动态地分配给不同的角色。 RBAC模型间的关…...
![](https://www.ngui.cc/images/no-images.jpg)
MFC中的Button修改颜色的方法
添加工具箱下面的MFC Button Control控件(不使用普通的Button控件);给按键添加变量:m_MFCButton1,变量类型(默认)为:CMFCButton;testDlg.cpp中初始化中添加如下代码&…...
![](https://img-blog.csdnimg.cn/5cff7ee2b9c64309bd4b54e05a995af5.gif)
【算法】选择排序
选择排序 选择排序代码实现代码优化 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录&…...
![](https://www.ngui.cc/images/no-images.jpg)
golang之context实用记录
简言 WithCancel()函数接受一个 Context 并返回其子Context和取消函数cancel 新创建协程中传入子Context做参数,且需监控子Context的Done通道,若收到消息,则退出 需要新协程结束时,在外面调用 cancel 函数,即会往子C…...
![](https://img-blog.csdnimg.cn/img_convert/23f8e7fbb5ec1ef99ac5c09f175885bd.png)
音视频FFmpeg简单理解学习,必学技术
FFmpeg是一个开源的多媒体框架,它包含了一个用于音频和视频编解码的库。它可以执行各种多媒体操作,如格式转换、视频剪辑、音频处理等。可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 FFmpeg的结构 默认的编译会生成…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
一款内网信息收集利用工具
FuckDomainMini 简介 这是一款基于java开发Windows的内网信息收集、利用工具 可以节省您的信息收集所花费的,又或者是做免杀所花费的时间 现在这个版本是先行版本,目前先行版只有一个功能,更多的功能还在调试与开发中。 尽情期待&#x…...
![](https://img-blog.csdnimg.cn/73a8ad2dd75142a994d03b6a67947501.png)
数据库表的操作
目录 一、表的创建 1、创建语法 2、创建案例 二、查看表结构 三、修改表 1、修改表名 2、添加记录 3、修改列属性 4、添加列(字段) 5、删除列(字段) 6、修改列名字 四、删除表 五、修改表结构的风险 1、风险 2、建议 一、表的创建…...
![](https://www.ngui.cc/images/no-images.jpg)
Golang开发--channel的使用
在 Go 语言中,channel(通道)是一种用于在 goroutine 之间进行通信和同步的并发原语。它提供了一种安全且简单的方式来传递数据。 通道的详细描述和使用方法 1.定义通道: 通道是通过使用 make 函数来创建的。通道有特定的类型&am…...
![](https://img-blog.csdnimg.cn/a8f9329741ee4ee3bd98f18b551c1a4f.png)
SQL sever中表管理
目录 一、创建表: 1.1语法格式: 1.2示例: 二、修改表: 2.1语法格式: 2.2示例: 三、删除表: 3.1语法格式: 3.2示例: 四、查询表: 4.1语法格式&…...
![](https://www.ngui.cc/images/no-images.jpg)
CSSoverflow 属性
overflow 属性用于设置当元素中的内容溢出后的情况。 值得注意的是: 所谓溢出,是指子元素的大小(包括文本、元素或图片等)超出父元素的区域,会有一部分内容显示在父元素所在的区域外。 属性值描述visible默认值。内容不会被修剪&a…...
![](https://img-blog.csdnimg.cn/64cfe26aa76d4f1e9143e241d9d08117.png)
08:STM32----DMA数据转运
目录 1:简历 2:存储器映像 3:DMA基本结构 4: DMA转运的条件 5:DMA请求 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 4:步骤 5:代码 B:DMAAD多通道 1:连接图 2:结构图 3:函数介绍 4:代码 1:简历 DMA(Direct Memory Access)直接存储…...
![](https://www.ngui.cc/images/no-images.jpg)
Golang 程序漏洞检测利器 govulncheck(二):漏洞数据库详解
上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 的使用方法,govulncheck 强大功能的背后,离不开 Go 漏洞数据库(Go vulnerability database)的支持,接下来详细讲解下 Go 漏洞数据库相关的知识。 Go 漏洞数…...
![](/images/no-images.jpg)
手机网站是怎么做的/软文大全500篇
If you want something youve never had, you must be willing to do something youve never done. 如果你想拥有从未有过的东西,那么你必须去做你从未做过的事。(Thomas Jefferson) 原文载于:爱词霸英语学习网-每日一句...
![](/images/no-images.jpg)
昆山市住房和城乡建设局网站/杭州网站优化公司
计算机软件(Computer Software,又称软件)是指计算机运行所需的程序和程序相关文档,程序是对计算任务的处理对象和处理规则的描述;文档是为了便于理解程序所需的解释性信息。程序必须装入机器才能工作,文档一般是给人看的ÿ…...
![](/images/no-images.jpg)
长沙快速建站模板/seo外链工具源码
从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型。 一、介绍 json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格…...
![](/images/no-images.jpg)
公司注册网上申请流程/seo云优化平台
在github项目下的子文件夹通常没有download的标志,如图所示 image ###GitZip插件 chrome浏览器添加GitZip插件,参考自GitZip for github 管理扩展程序,直接添加gitzip插件即可。 在项目下载网页,点击git zip插件,会弹出…...
asp的web音乐网站设计/营销策略模板
这里改下 settgings.xml中的配置,jar下载用阿里云 ,下载速度比较快...
![](/images/no-images.jpg)
急求一张 网站正在建设中的图片/个人怎么在百度上做推广
最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意c语言的数据类型的数据范围。 对有符号、无符号数据的使用存在误区,对类型转换理解…...