六大设计模式原则

news2024/11/25 0:28:19

1 单一职责原则

(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更
顾名思义:一个类只负责一项职责

基本介绍
即对类来说,一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2,当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2

在这里插入图片描述
如何遵守单一职责原则?
其实就是合理的职责分解,
从业务出发,从需求出发,识别出同一个类型的职责
需要说明一点:单一职责原则不是面向对象语言特有的,只要是模块化的程序设计,都要遵守单一职责原则

2 接口隔离原则

(Interface Segregation Principle),又称为ISP原则,官方定义为:

Clients should not be forced to depend upon interfaces that they don’t use.
(客户端不应该依赖它不需要的接口)
The dependency of one class to another one should depend on the smallest possible
interface. (类间的依赖关系应该建立在最小的接口上)

基本介绍
通俗的来讲,不要在一个接口里面定义过多的方法,接口应该尽量细化。
接口隔离原则就是当我一个类通过接口依赖(使用)另一个类的时候,要保证依赖的该接口是最小的,
接口里面有方法用不到的,就进行隔离,而隔离的做法就是,就对原来接口进行拆分,拆分为最小粒度,来避免耦合

与单一职责原则对比

  • 单一职责原则:合理的职责分解,一个类只负责一项职责
  • 接口隔离原则:类间的依赖关系应该建立在最小的接口上

相同点
都要求对结构进行拆分,都要求更小的粒度,都希望减少耦合

不同点
审视角度的不同

单一职责原则:类与接口职责单一,注重的是职责
接口隔离原则:要求我们尽量使用多个专门的接口,注重的是接口的设计

我们使用接口隔离原则进行接口拆分的时候,要遵循单一职责原则

3 依赖倒转原则

其实我们在实际的开发中大部分都是遵守依赖倒转原则。即面向接口编程,习惯成自然,不知所以然。通过这个分析明确出来,以后写代码时就明白了为什么这样写,同时就会有意的去遵守这些看似简单但却很重要的设计模式原则,降低耦合提高代码质量。

官方定义

  • 依赖倒转原则,又称依赖倒置原则(Dependence Inversion Principle),又称DIP原则,官方定义为:
    High level modules should not depend upon low level modules. Both should depend upon abstractions.
    (上层模块不应该依赖底层模块,它们都应该依赖于抽象)
    Abstractions should not depend upon details. Details should depend upon abstractions.
    (抽象不应该依赖于细节,细节应该依赖于抽象)

基本介绍

何为抽象? —> 接口或者抽象类
何为细节?—> 实现类
换句话说 依赖倒转原则核心的理念 相对于细节来说,抽象要稳定得多
要求我们 面向接口编程
java中抽象类和接口的目的就是制定好规范,不会涉及具体的操作 展现细节或者实现具体的业务逻辑,这些是要交给对应的实现类来解决的、换句话说抽象类和接口的价值就在于设计
总结: 依赖倒转原则其实就是要求我们面向接口编程,其实就是要求我们在编码的时候注意抽象类和接口的设计

4 里氏替换原则

里氏替换原则就是给继承性的使用制定了规范
里氏替换原则通俗的来讲:

子类可以扩展父类的功能,但是子类不能修改父类原有的功能 ;只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或者异常,使用者可能根本不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。

在这里插入图片描述

5 开闭原则

官方定义

开闭原则( Open Close Principle ),又称为OCP原则,他的官方定义如下:
Software entities like classes,modules and functions should be open for extension but closed for modifications.
一个软件实体如类,模块和函数应该对扩展开放,对修改关闭

基本介绍
针对调用方无任何修改,针对提供方是可以扩展的
对扩展开放 – 提供方
对修改关闭 – 调用方
就是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。那么什么是软件实体呢?软件实体包括一下几个部分:

  • 项目或软件产品中按照一定的逻辑规则划分的模块。
  • 抽象和类。
  • 方法。

6 迪米特法则

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least KnowledgePrinciple, LKP)
One object should have a minimum understanding of other objects
(一个对象应该对其他对象有最少的了解 )
Only talk to your immediate friends ( 只与直接的朋友通信)

基本介绍

什么是一个对象应该对其他对象有最少的了解?

换句话说,对于被依赖的类,不管多么复杂都应该将逻辑封装在类的内部,对外只提供公共的public方法,不对外泄露任何其他的信息。

什么是只与直接的朋友通信?
朋友关系: 只要两个对象有依赖关系那他们两个就是朋友关系

直接的朋友:

  • 成员变量

也就是说一个类以成员变量的形式出现在另一个类内部的那么这两个类互为直接的朋友

  • 方法的参数类型

也就是说一个类的方法接收的参数类型是另一个类的类型那么这两个类互为直接的朋友

  • 方法的返回值类型

也就是说一个方法中接收的返回值类型是另一个类的类型那么这两个类互为直接的朋友

比如说在方法内部使用到的,比如说这个类以局部变量的形式出现的,这种情况下他们就不是直接的朋友关系。

在这里插入图片描述

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

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

相关文章

Milvus 介绍

Milvus 特点 在万亿矢量数据集上实现惊人的搜索速度:在万亿矢量数据集上,矢量搜索和检索的平均延迟可达毫秒级。简化的非结构化数据管理: Milvus 拥有专为数据科学工作流程设计的丰富 API。可靠、始终在线的矢量数据库: Milvus 内…

MA35D1测试-记录

1.查看拨码开关的启动设定 找到开发板:拨码快关,复位按键、电源开关的位置! 2.三根线和软件(一根5V/2A电源适配线、两根usb线) 三根线:一根5V/2A电源适配线、两根usb线 电源线插上,确保可以波…

kafka入门,节点服役和退役(新增节点和删除节点)(十二)

1、节点服役 1、克隆准备其中一台节点 2、如果新节点的kafka有被log和datas文件夹要删除 3、修改/etc/hosts 配置新节点映射 1.1 执行负载均衡操作 vim topics-to-move.json{"topic": "主题名称"} {"topics": [{"topic": "fi…

提高学习效率:必备学习软件推荐

在当今数字化的学习环境中,选择适合自己的学习软件是提高效率和获取知识的关键。 分享一:伙伴云 伙伴云是一款强大的数据协作工具,它利用仪表盘进行数据分析,并实现了月度报表的自动汇总功能。 伙伴云的仪表盘集合了大数据分析…

Leetcode 445. 两数相加 II

原题链接:Leetcode445. Add Two Numbers II You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contains a single digit. Add the two numbers and return the…

代码冗余太多?给新人Code Review头都大了?

一、前言 开发过程中,只是觉得前端后端合起来,有很多冗余信息,被代码一遍遍重复表达,是一件很枯燥、无聊的事情。这些枯燥的重复工作,完全可以由机器来做,以便解放出我们的时间,来做更有价值的工…

vue实现复制文本

方法一: 原理:浏览器本身提供了一个copy命令,利用它可以复制选中的内容:如果是输入框,我们可以利用select()方法来选中输入框中的内容,然后调用copy命令,将文本复制到剪切板,但是se…

菱形继承及菱形虚拟继承

复杂的菱形继及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承是多继承的一种特殊状态 菱形继承的问题:从下面的对象成员模型构造&#xff…

【Linux】指令与权限

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 一、Xshell配置 会话配置 日志 二、指令 date指令 cal指令 find指令(极其重要) -name grep指令…

【python pip 安装错误 ModuleNotFoundError: No module named pip._internal 解决办法】

🚀 零基础入门学习Python🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜…

【OpenGL】读取视频并渲染

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍读取视频并渲染。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#…

数据中心动环监控系统分析与应用

摘要:介绍了数据中心动环监控系统,并结合原理图详细分析。本系统主要对数据中心的电源设备和环境参数 进行监控,如 UPS、蓄电池、配电柜、温湿度、漏水监测等,将实现多机房、微模块远程联网集中监管, 从而为提高数据中…

Redis 三种模式-------主从复制、哨兵及集群

目录 一、主从复制1.1 主从复制的概念1.2 主从复制的作用1.3 redis 主从复制流程1.4 搭建Redis 主从复制1、 环境准备2、 安装Redis3、 修改redis配置文件(master节点配置)4、 修改redis配置文件(slave节点操作)5、 验证主从效果 …

7.1.3 Linux的EXT2文件系统(inode)

inode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容。 而且文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则 inode 与 b…

JAVA开发(JAVA视频监控接口相关)

一、背景 最近在做视频监控接口相关的开发,需要调用视频的接口获取直播地址,回放地址,然后集成到web里查看。 二、涉及的接口 1、获取卡口的id 2、通过卡口id获取通道(设备的id) 3、通过设备的id获取到直播地址 4…

阿拉德之怒手游架设教程

阿拉德之怒是一款大型多人在线角色扮演游戏(MMORPG),在全球范围内拥有庞大的玩家群体。该游戏以其精美的画面、丰富多样的职业和任务系统而闻名,让玩家可以沉浸在一个充满冒险和挑战的奇幻世界中。对许多玩家而言,阿拉…

vue有意思的图片动画插件direction-reveal

功能:操作简单好上头,动画特效很丝滑,有很多种供选择 1.下载插件 npm install direction-reveal --save-dev 2.使用 导入到需要使用动画的单页面 import DirectionReveal from direction-reveal; 使用样式 mounted() {this.query();},m…

【深度学习笔记】浅层神经网络

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: https://m…

GoLand live template自定义模板失效问题解决

目录 问题背景原因分析问题解决 问题背景 我希望在goland自定义一个注解模板,输入/**Enter可以补全如下图所示 /** * description TODO * param null * return * author user * date 2023/7/4 15:24*/ func main() {print("hello world\n") }于是我在Fi…

Vue指令案例

案例需求&#xff1a; 将Vue数据模型中的数据以表格的形式渲染展示 具体代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-wid…