【设计模式】(二、)设计模式六大设计原则

news2024/11/23 19:48:52

一、 设计原则概述

设计模式中主要有六大设计原则,简称为SOLID ,是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的),六大设计原则分别如下:

1、单一职责原则(Single Responsibitity Principle)

2、开放封闭原则(Open Close Principle)

3、里氏替换原则(Liskov Substitution Principle)

4、接口分离原则(Interface Segregation Principle)

5、依赖倒置原则(Dependence Inversion Principle)

6、迪米特法则(Law Of Demter)

软件开发中我们要基于这六个原则,设计建立稳定、灵活、健壮的程序。

二、设计原则分

2.1 单一职责

单一职责原则的定义描述非常简单,也不难理解。一个类只负责完成一个职责或者功能。

也就是说在类的设计中 我们不要设计大而全的类,而是要设计粒度小、功能单一的类.

比如 我们设计一个类里面既包含了用户的一些操作,又包含了支付的一些操作,那这个类的职责就不够单一,应该将该类进行拆分,拆分成多个功能更加单一的,粒度更细的类.

2.2 开闭原则

定义:对扩展开放,对修改关闭

对扩展开放和对修改关闭表示当一个类或一个方法有新需求或者需求发生改变时应该采用扩展的方式而不应该采用修改原有逻辑的方式来实现。因为扩展了新的逻辑如果有问题只会影响新的业务,不会影响老业务;而如果采用修改的方式,很有可能就会影响到老业务受影响。

开闭原则是所有设计模式的最核心目标,也是最难实现的目标,但是所有的软件设计模式都应该以开闭原则当作标准,才能使软件更加的稳定和健壮。

优点:

  1. 新老逻辑解耦,需求发生改变不会影响老业务的逻辑

  2. 改动成本最小,只需要追加新逻辑,不需要改的老逻辑

  3. 提供代码的稳定性和可扩展性

2.3 里氏替换原则

如何理解里氏替换原则?

要理解里氏替换原则,其实就是要理解两个问题:

  • 什么是替换?
  • 什么是与期望行为一致的替换(Robert Martin所说的“必须能够替换”)?

1 ) 什么是替换 ?

替换的前提是面向对象语言所支持的多态特性,同一个行为具有多个不同表现形式或形态的能力。

以JDK的集合框架为例,List接口的定义为有序集合,List接口有多个派生类,比如大家耳熟能详的ArrayList, LinkedList。那当某个方法参数或变量是List接口类型时,既可以是ArrayList的实现, 也可以是LinkedList的实现,这就是替换。

2 ) 什么是与期望行为一致的替换?

在不了解派生类的情况下,仅通过接口或基类的方法,即可清楚的知道方法的行为,而不管哪种派生类的实现,都与接口或基类方法的期望行为一致。

不需要关心是哪个类对接口进行了实现,因为不管底层如何实现,最终的结果都会符合接口中关于方法的描述(也就是与接口中方法的期望行为一致).

或者说接口或基类的方法是一种契约,使用方按照这个契约来使用,派生类也按照这个契约来实现。这就是与期望行为一致的替换。

2.4 接口隔离原则

要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

接口隔离原则与单一职责原则的区别

接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:

  • 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
  • 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

2.5 依赖倒置原则

依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。

  1. 高层级的模块应该依赖的是低层级的模块的行为的抽象,取决于具体编程语言,可以是抽象类或者接口等技术;
  2. 第2句话其实很简单,只有一个意思:只要依赖了实现,就是耦合了代码,所以我们需要始终依赖的是抽象,而不是实现。
  • 传统的自定向下的设计

    传统设计方式采用自顶向下的原则, 逐级依赖,中层模块和高层模块的耦合度很高,如果需要修改其中的一个模块,则可能会导致其它很多模块也需要修改,牵一发动全身,不易于维护。

    不使用依赖反转的系统构架,控制流和依赖关系流的依赖箭头是一个方向的,由高层指向底层,也就是高层依赖底层

在这里插入图片描述

  • 依赖倒置原则

    依赖倒置原则的好处:

    • 减少类间的耦合性,提高系统的稳定性 . (根据类与类之间的耦合度从弱到强排列:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系 )
    • 降低并行开发引起的风险 (两个类之间有依赖关系,只要制定出两者之间的接口(或抽象类)就可以独立开发了)
    • 提高代码的可读性和可维护性

在这里插入图片描述

2.6 迪米特法则

大部分设计原则和思想都非常抽象,有各种各样的解读,要想灵活地应用到 实际的开发中,需要有实战经验的积累。迪米特法则也不例外。

简单来说迪米特法则想要表达的思想就是: 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

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

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

相关文章

Flutter SDK 常见问题

镜像配置 配置pub服务的镜像地址: export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 第一次运行项目很慢,搜索整个Flutter SDK项目,使用以下内容替换google和mavenCentral仓…

【精选】Java项目介绍和界面搭建——拼图小游戏 中

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

福派斯课堂:猫软便呕吐不吃东西有什么影响?

🐱 猫软便、呕吐、不吃东西,这些症状听起来让人担心。作为猫咪的主人,看到它们不舒服,心里肯定不好受。那么,这些症状对猫咪有什么影响呢? 1️⃣ 营养失衡:如果猫咪不吃东西,身体就无…

[⑥5G NR]: 无线接口协议,信道映射学习

5G系统整体包括核心网、接入网以及终端部分,接入网与终端间通过无线空口协议栈进行连接。无线接口可分为三个协议层:物理层(L1)、数据链路层(L2)和网络层(L3)。 L1:物理…

【设计模式】(一)设计模式概述

一、设计模式概述 设计模式(Design pattern)**是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结 在GOF编写的设计模式(可复用面向对象软件的基础)一书中说道: 本书涉及的设计模式并不描述新的或未经证实的设计,我们只收…

LeetCode34.在排序数组中查找元素的第一个和最后一个位置

题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 输入…

模型选择与评估

🚩 机器学习的一般流程包括:数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型…

Javascript:输入输出

目录 一.前言 二.正文 1.输出 2.输入 3.字面量 概念: 三.结语 一.前言 Javascript作为运行浏览器的语言,对于学习前端的同学来说十分重要,那么从现在开始我们将开始介绍有关 Javascript。 二.正文 1.输出 document.write() : 向body内…

新品齐发!小牛电动打造全场景高端化产品阵列!

2 月 29 日,全球智能城市出行品牌小牛电动发布“新世代性能旗舰”电摩NX、电自NXT,以及“全场景智驾越野电摩”X3三款新品。同时,与知名体育电竞俱乐部——JDG京东电子竞技俱乐部携手,打造“英雄的联盟”超级形象,引领…

扫码点餐多门店先付后餐小程序开发

多门店扫码点餐系统-先付后餐模式-公众号与小程序开源版 适用范围:适用于快销类餐饮,如早餐、面馆、快餐、零食小吃等,满足顾客快捷扫码点餐的需求。 该系统仅支持先付款后就餐的模式,不支持赊账或后付款服务。 核心功能&…

免费pr素材(Premiere创意彩色图形动画背景视频素材)下载

Premiere素材,10个创意彩色图形动画pr背景视频素材,Pr动态图形模板mogrt下载。 特点:Premiere Pro 2023或更高版本,超高清分辨率:38402160,每秒25帧的帧速率,包括教程视频。来自PR素材网&#x…

MDS500-16-ASEMI整流模块MDS500-16参数、封装、尺寸

编辑:ll MDS500-16-ASEMI整流模块MDS500-16参数、封装、尺寸 型号:MDS500-16 品牌:ASEMI 封装:M34 正向电流(Id):500A 反向耐压(VRRM):1600V 正向浪涌…

Amino PEG11 COOH,Amino-PEG11-acid,可在活化剂存在下与氨基反应

您好,欢迎来到新研之家 文章关键词:1616426-12-0,Amino-PEG11-acid,Amino PEG11 COOH,H2N-PEG11-CH2CH2COOH,氨基-PEG11-羧酸 一、基本信息 【产品简介】:Amino-PEG11 acid is a heterobifun…

探索Redis 6.0的新特性

Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,通常被用作缓存、消息队列和实时数据处理等场景。它的简单性、高性能以及丰富的数据结构支持使其成为了众多开发者和企业的首选。在Redis 6.0版本中,引入了一…

超越CPU和GPU:引领AI进化的LPU

什么是CPU CPU(Central Processing Unit)是由数十亿个晶体管构成的,可以拥有多个处理核心,通常被称为计算机的“大脑”。它对所有现代计算系统至关重要,因为它执行计算机和操作系统所需的命令和进程。CPU在决定程序运…

Leetcoder Day32| 贪心算法part05

763.划分字母区间 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例: 输入:S "ababcbacadefegdehijhklij"输出:[9,7…

【Leetcode每日一题】二分查找 - LCR 173. 点名(难度⭐)(24)

1. 题目解析 Leetcode题目链接:LCR 173. 点名 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于找到题目所给的连续数组中缺失的数字即可。 2.算法原理 在这个升序的数组中,我们发现: …

金融方案再获认可!持安获评2023年度金融行业优秀解决方案

近日,由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式发布。零信任办公安全技术创新企业持安科技荣获“2023年度优秀解决方案-金融行业优秀解决方案”。 安全419是以内容报道服务于行业的垂直资讯媒体和第三方企业服务机构。11月…

【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

力扣题目链接 1. 暴力解法 这道题的暴力解法是两层嵌套for循环,第一层循环从 i 0 开始遍历至数组末尾,第二层循环从 j i 开始遍历至找到总和大于等于 target 的连续子数组,并将该连续子数组的长度与之前找到的子数组长度相比较&#xff0…

腾讯:《智能科技 跨界相变——2024数字科技前沿应用趋势》

1月23日,腾讯发布了题为《智能科技 跨界相变——2024数字科技前沿应用趋势》的报告,报告从计算重塑、智能升维、沉浸交互、未来连接四个方面,对100多项未来技术和重点方向给出了趋势性判断。并表示我们正驶向一个由连接衍生交互、由计算催生智…