设计模式之设计原则

news2025/2/3 18:09:51
程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。

在这里插入图片描述
在这里插入图片描述
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、提高扩展性、提高灵活性和提高开发效率,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
简单说:
模式:在某些场景下,针对某类问题的某种通用的解决方案。
场景:项目所在的环境。
问题:约束条件,项目目标等
解决方案:通用、可复用的设计,解决约束达到目标。
设计模式可以分为三种类型
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构型模式:把类或对象结合在一起形成一个更大的结构。
行为型模式:类和对象如何交互,及划分责任和算法。

1.1单一职责原则

解释:
单一职责 SRP–Single Responsibility Principle
应该有且仅有一个原因引起类的变更。
1.系统中的每个类都应该只有一个职责,而所有类所关注的就是自身之职责的完成。
2.职责是指为”变化的原因”。
3.如果能想到多个原因去改变一个类,这个类就是多个职责。
4.并不是单一功能原则,并不是每个类只能有一个方法,而是单一”变化的愿意”原则。
5.如果一个类有多个职责,这些职责就耦合在了一起,当一个职责发生变化时,可能会影响其他职责。
6.多个职责耦合在一起,会影响服用性(可能只需要服用该类的某一个功能,但是该职责和其他职责耦合在一起,很难分离出来)。
其实就是我们常说的高内聚低耦合原则,.单一职责原则是最简单也非常难实现的原则。
好处:
将功能分类,模块划分明确,修改一个模块不会造成其他模块的修改,降低模块之间的耦合度。
举例:
MVC模式下,无论是Controller层还是service亦或是DAO层,针对每个表格都有独立的实现类,不要掺杂在一起,以免因为任何一个操作的变化都引起类的修改。
图解:
饭店老板 既当厨师,又当服务员,这不合适
在这里插入图片描述

1.2开闭原则

解释:
开闭原则 OCP— Open Closed Principle
软件实体应该对功能的拓展开放,对修改关闭的原则, 因为需求有变化,要求我们设计程序时必须为程序功能的新增留好接口,在新增功能时,不要修改原有代码,而是新增代码.让程序实现对拓展开放,对修改关闭测设计要求。
1实现开闭原则的关键是抽象。
2定义一个抽象层,之规定功能而不提供实现,实现通过定义具体的类来完成。
3当需求变化时,不通过修改抽象层来完成,而是通过定义抽象层的新实现完成。
4通过抽象类及接口,规定了具体的类的特征作为抽象层,相对稳定,不需要修改,从而满足对修改关闭,从抽象类到处的具体类可以作为改变系统的行为,从而满足对扩展开放。
好处:
1通过扩展已有软件系统,可以提供新的行为,以满足对软件新的需求,提高了软件系统的适应性和灵活性。
2已有的软件模块,特别是重要的抽象层模块不能再修改,提高了软件系统的一定的稳定性和延续性。
3这样的设计同时也满足了可复用性和可维护性。
举例:
MVC模式下,每一层都有接口,是和其他层对接的规范,新增功能时,我们可以选择新增Controller层和service层和mapper层代码 不用去修改原有代码。
图解:
每一个层次的要求都要留好接口,作为规范,增加功能就相当于多了一个实现类去实现接口,而不是在先有代码上修改,工厂方法模式。

1.3里氏代换原则

解释
里氏代换原则 LSP------ Liskov Substitution Principle
所有引用的基类的地方必须能够透明的使用其子类的对象。
凡是父类出现的地方,其子类就可以出现,而且调用子类还不能产生多于父类的错误和异常,调用者根本就不要需要知道是子类还是父类对象.但是反过来就不行,子类出现的地方父类未必就能使用。
父类出现的地方,子类对象就能出现;子类出现的地方,父类未必能出现(泛型的向下限定)。
1.子类必须完全实现了父类的方法,具备父类完全的功能。
2.子类可以有自己的特征。
3.覆盖和实现父类方法时,输入的参数可以被放大,但是不能被缩小。
4.覆盖和实现父类方法时,输出的结果可以被缩小,但是不能被放大。。
5.覆盖和实现父类方法时,产生的异常可以被缩小,但是不能被放大
好处:
为我们如何实现良好的继承和使用多态提供了依据,也是实现开闭原则的重要保证。
举例:
白马 马也
乘白马 乘马也
黑马 马也
乘黑马 乘马也
乘的是马 什么颜色的马都是马
马 是父类 各种颜色的马是子类 要求的是父类,所有的子类对象都可以使用

娣 美人也 爱娣 非爱美人也
美人 父类 娣 子类 要求是子类的地方,父类不一定能够出现

父类作为方法参数和返回值,可以让参数更灵活
张三能开车
张三就能开奥迪
张三就能开奔驰
张三就能开宝马
图解:
在这里插入图片描述

1.4依赖倒置原则

解释
依赖倒置 DIP–Dependence Inversion Principle
高层模块不应该依赖底层模块,两者都应该依赖抽象,抽象不应该依赖细节,细节应该依赖抽象。
尽量依赖接口和抽象类,不要依赖具体的实现。
抽象:即是抽象类或者接口,两者是不能够实例化的。
细节:即是具体的嫌累,实现接口或者继承抽象类的类。
依赖正置就是类之间的依赖是实实在在的实现类之间的依赖,也就是面向实现编程。
依赖倒置就是通过抽象(抽象类或者接口),使各个模块之间实现彼此独立,不相互应影响。
依赖倒置有三种方式实现
1.构造函数传递依赖对象 。
2.setter方法实现。
3.接口声明实现依赖对象 ()匿名内部类。
依赖倒置原则要求
1.每个类尽量都有接口和抽象类,或者抽象类和接口都有。
2变量的表面类型应是接口和抽象类。
3任何类都不应该从具体派生(尽量避免继承,做二次开发时,无法获得高层代码时除外)。
4.尽量不要覆盖基类已经实现好的方法(尽量不要重写父类方法)。
好处:
采用依赖倒置原则可以降低模块之间的耦合性,提高系统的稳定性,减少并行开发的风险,提高代码的可读性和可维护性。
举例:
一个类组合另一个类作为属性时,应尽量选择抽象类或者是接口,尽量避免直接组合实现类。
电脑里的零件坏了,如硬盘,内存,CPU等,那么直接更换对应的配件,只要插槽一样就能互换,维护比较方便.插槽就是接口,具体的硬件就是实现类.留好接口可以随时换零件,如果零件直接焊死在电脑上,坏了就没有办法更换了。
图解:
抽象的Driver接口和抽象的Car接口 实现司机开车功能。
在这里插入图片描述

1.5接口隔离原则

解释
接口隔离原则 ISP Interface Segregation Principle
客户端不应该强行依赖他不需要的接口,类之间的依赖关系应该建立在最小的接口上,建立单一接口,不要建立庞大臃肿的接口,应该尽量细化接口,接口中的方法尽量少,也就是说要为各个类建立专门的接口,而不要试图去建立一个庞大的接口供所有的依赖它的类去调用。
接口隔离原则使用的一些规范
1.接口尽量小,尽量细致。
2.接口尽量高内聚,尽量和其他接口撇清关系。
3.定制服务,为调用者提供且之提供他需要的方法。
4.接口设计有限度,根据业务及经验,仔细四高筹划,适度隔离接口。
单一职责和接口隔离辨析
1.单一职责原则侧重职责,接口隔离侧重对接口的依赖的隔离。
2.单一职责原则侧重约束类,其次是接口,针对程序中实现的细节。
3.接口隔离原则侧重约束接口,主要针对抽象需求,针对程序的整体框架的构建。
好处:
防止庞大,臃肿的接口,避免接口污染,提高程序设计要求的细致划分性,降低大面积维护成本.一旦出现接口污染,会造成实现类中存在大量的不相关不需要去重写的方法。
举例:
演员和角色以及整部戏的关系。
图解:
不满足接口隔离原则的情况:
在这里插入图片描述

满足接口隔离原则的情况:
在这里插入图片描述

1.6迪米特法则

解释
迪米特法则 LOD–Law of Demeter
只与你只直接的朋友通信 ,不要和不相关的人产生大量通信,如果两个类不必彼此通信,那么两个类就不应到发生直接的相互作用,如果其中的一个类需要调用另一个类的方法的话,可以通过第三者转发这个调用。
迪米特法则的初衷是在于降低类之间的耦合.但是迪米特法则有可能造成一个后果就是程序中存在大量的中介类,这些中介类完全就是为了传递类间的相互调用关系,一定程度上增加了系统的复杂度。
好处:
降低了类和类之间的耦合。
举例:
找中介卖房子,不用我们自己直接接触大量的买房人员。
图解:
在这里插入图片描述

1.7合成/聚合复用原则

解释
合成/聚合复用原则 CARP Composite Aggregate Reuse Principle
当一个类想使用另一个类的功能时,优先使用对象的组合,而不是继承,尽量多使用组合。
合成聚合复用原则是值在一个新对象中通过组合关系使用原来已有的一些对象,使之成为新对象的一部分,通过使用已有对象的API完成已有功能的调用。
为什么要是用合成聚合,尽量不要使用继承?
1.继承破坏包装,把超类的实现细节直接暴露给子类,不利于信息的隐匿。
2.如果父类发生改变,会引发一系列子类的改变,类之间耦合度高。
3.继承是一种静态功能的使用,在运行的过程中不能发生改变,聚合复用可以动态传入子类对象实现功能动态改变。
好处:
非常有利于构建可维护,可复用,可扩展和灵活性好的软件系统。
举例:
汽车上如果想获得行车记录的功能,单独组合一个行车记录仪对象作为属性即可,没有必要继承行车记录仪类。
图解:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础语法入门

14天学习训练营导师课程: 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 上一节课,我们了解了基础环境如何配置&#xff0c…

【深度学习】图像分类数据集Fashion-MNIST

今天在手撸深度学习代码的时候,遇到了这个数据集,但是调用的函数的参数和功能不是很明白,因此选择写篇博客总结一下。 一、介绍 Fashion-MNIST是⼀个10类服饰分类数据集。 torchvision 包:它是服务于 PyTorch 深度学习框架的&a…

springboot+maven大学校友活动风采展示管理信息系统

大学校友管理信息系统当然也不能排除在外,从校友活动、校友风采的统计和分析,在过程中会产生大量的、各种各样的数据。本文以大学校友管理信息系统为目标,采用B/S模式,以SSM为开发框架,Jsp为开发技术、Eclipse/idea为开…

计算机毕业设计之java+ssm爱家房屋租赁信息管理系统

项目介绍 本爱家房屋租赁信息管理系统是针对目前房屋租赁信息管理的实际需求,从实际工作出发,对过去的房屋租赁信息管理系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下&#xf…

Linux进阶-编辑器以及Shell编程

常用两个编辑器 gedit编辑器:依赖图形界面。 vi/vim编辑器:sudo apt install vim(安装vim编辑器) vim与vi的区别: vim是vi的升级版本,兼容vi; vi按u只能撤销上次命令,而在vim里…

java计算机毕业设计基于安卓Android的校园单车租赁App

项目介绍 校园单车租赁APP管理是校园单车租赁管理中对用户必不可少的一个部分。在人们校园单车租赁管理的整个过程中,校园单车租赁APP管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类校园单车租赁APP管理程序也在不断改进。本课题所设计的校园单车租赁APP,使用ssm框…

Nginx源码分析--内存池

1.问题引入 使用C语言编程时,一般使用malloc和free进行动态内存申请和释放。如果一不小心忘记了调用free进行释放,很容易造成内存泄露。另一方面,频繁地进行malloc和free操作,很容易造成内存碎片。与此同时,因为mallo…

[Spring Cloud] nacos作为服务中心

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

【C语言从0到1之指针】(详解,赶紧收藏期末考试备用)

🕺作者:启明星使 🎃专栏:《数据库》《C语言》《数据结构》 🏇分享喜欢的一句话:去发光,而不是等待被照亮​ 目录 1. 指针是什么 内存 指针变量 总结: 外: 2. 指针和…

比 O(nlog(n)) 做得更好 — 5.结束语和基准

这就是 groupSort 真正优于 mergeSort 的地方。 长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩 最后的想法 我们知道,将一个大问题分解为一系列更小…

vmware虚拟机黑屏问题

💐文章适合于所有的相关人士进行学习💐 1.问题描述 VMware虚拟机出现了黑屏现象,打开虚拟机挂起能看到显示,但一开就黑屏。下面就给大家说说虚拟机黑屏怎么办,vmware虚拟机开机黑屏的解决方法。 大多数同学在安装第…

策略验证_卖出口诀_长箭射天股价落地

写在前面: 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

mysql运行报错:

Install/Remove of the Service Denied!解决办法:Install/Remove of the Service Denied解决办法 上面报错看这篇:MySQL本地连接报错:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061) 上面报错看这篇&#xf…

【Ubuntu】实现windows和ubuntu之间的共享文件

实现windows和ubuntu之间的共享文件一、配置windows和ubuntu之间的共享文件夹(方式1)二、通过将windows中的文件拖拽到ubuntu的终端之上(方式2)一、配置windows和ubuntu之间的共享文件夹(方式1) VMware菜单…

UE Select File / Folder Window 插件说明

本插件可以在蓝图中打开系统自带的文件/文件夹选择窗口。并且可以在打包出发行包。 1. Open Load File Window 打开文件读取选择窗口,只能单选文件,此函数只是返回文件路径,不会真正读取文件信息 输入 Dialog Title :打开窗口的…

[附源码]java毕业设计图书管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java EE|软件视角下的操作系统

文章目录前言操作系统的概念及常见的OS举例操作系统的定位以及它的功能/职责/作用全程高能!!!敲黑板警告!!!一、进程概念(感性认知)二、进程的描述和组织!!&a…

步进电机实验

一、实验目的: 掌握步进电机的控制方法 二、实验内容与要求: 编写实验程序,利用8255的B口来控制步进电机的运转。 三、实验环境: PC机一台,TD-PITE实验装置一套。 四、实验步骤: 1、参考下图连接实验…

Linux下如何操作寄存器

本期主题: linux下操作寄存器 往期链接: linux设备驱动中的并发linux设备驱动中的编译乱序和执行乱序linux设备驱动之内核模块linux字符驱动linux字符驱动之ioctl部分linux字符驱动之read、write部分linux驱动调试之Debugfs 文章目录1.为什么有这个问题…

内网信息收集(基于红日靶场1)

net view # 查看局域网内其他主机名 net config Workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域 net user # 查看本机用户列表 net user /domain # 查看域用户 net localgroup administrators # 查看本地…