设计模式 - 七大软件设计原则

目录

一、设计模式

1.1、软件设计原则

1.1.1、开闭原则

1.2.2、单一职责原则

1.2.3、里氏替换原则

1.2.4、迪米特原则

1.2.5、接口隔离原则

1.2.6、依赖倒转原则

1.2.7、合成/聚合复用原则


一、设计模式


1.1、软件设计原则

1.1.1、开闭原则

开闭原则:对扩展开放,对修改关闭,也就是说,尽量在不修改原有代码的情况下进行扩展.

通俗来讲,开闭原则就是告诉我们,不要取修改已经完成的程序,而是在原有的基础上进行扩展. 比如在 Java 中,我们设计程序的时候,不要写死,要留有接口,将来如果有什么需要进行扩展,直接在原有的接口上进行开发.

好处:当软件面临新的需求时,可以非常方便的在不修改原有代码的前提下进行扩展,使得软件具有更好的扩展,同时降低维护的成本.

1.2.2、单一职责原则

单一职责原则:一个类只负责一个功能领域中相应的职责.

通俗来讲,单一职责原则就是告诉我们,一个类不能太“累”.  在一个系统中,如果一个类承担的责任的越多,那么他被复用的可能性越小,耦合度很高.  所以我们在设计程序的时候就因该将这些职责封装到不同的类中.

好处:高内聚,低耦合.

1.2.3、里氏替换原则

里氏替换原则:继承必须保证父类所拥有的性质在子类中必须成立.

通俗来讲,里氏替换原则就是告诉我们,子类可以扩展父类的功能,但不能改变父类原有的功能.   也就是说,子类在继承父类的时候,除了添加新的方法用来扩展功能以外,尽量不要重写父类的方法.

子类重写父类方法虽然写起来很方便,但是继承体系的复用性就会很差,特别时多态运用频繁时,程序出错的概论就会很大.  如果不得不违背里氏替换原则,那么建议 “取消原来的继承关系,重新设计他们之间的关系”.

好处:里氏替换时实现开闭原则的重要方式之一; 降低类扩展时给已有的程序造成错误的概率,加强了程序的健壮性,可维护性、可扩展性.

1.2.4、迪米特原则

迪米特原则:一个类应当尽可能少和其他类发生相互作用.  

通俗来讲,就是要求我们在设计软件的时候,尽量减少类之间的交互,如果两个类不彼此直接通信,那么这两个类就不应当直接的相互作用.  如果其中一个类需要调用另一个类的方法,可以通过第三者转发这个调用(通过第三者来降低对象之间的耦合度).

这就好比,在电脑关机的时候,直接点击关机按钮,此时就会关闭其他的运行程序,然后才关闭电源.

好处:降低类之间的耦合,提高代码的复用.

1.2.5、接口隔离原则

接口隔离原则:客户端不因该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小接口上.  也就是说 接口的实现类尽量减少不必要的实现,可以把接口分开. 

通俗来讲,就是说当一个接口太大时,我们需要将他分割成一些小的接口.  每一个接口只需要包含一个客户端(如子模块或者业务逻辑类)所需的方法接口,也叫“定制服务”.

好处:加你个庞大的接口分解成多个粒度小的接口,提高系统的灵活性和可维护性.

1.2.6、依赖倒转原则

依赖倒转原则:高层模块不应该依赖底层模块,二者都因该依赖其抽象;抽象不因该依赖细节,细节因该依赖抽象.

在 Java 中,抽象就是接口或者抽象类,两者都不能被直接实例化,细节就是实现类,因此通俗来讲,就是使用接口或者抽象类制定好规范和契约,不去设计任何具体的操作,把展现细节的任务交给实现类来完成.  总而言之,依赖倒转原则就是面向接口编程.

1.2.7、合成/聚合复用原则

合成/聚合复用原则:也叫做合成复用原则,就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,  而新对象通过对这些对象的委派达到复用已有功能的目的.  尽量使用 对象组合,不要继承来达到复用的目的.

在面向对象设计中,可以通过两种方式实现复用已有设计,首先因该考虑使用 组合/聚合 可以使用系统更加灵活,降低类与类之间的耦合度.  其次才考虑继承,并且使用继承时,需要严格遵循 里氏替换原则.

好处:通过 合成/聚合关系可以将现有对象纳入到新对象中,使之成为新对象的一部分,让新对象可以调用已有对象的功能.  这样做使得成员对象内部实现不可见,达到 “黑箱” 复用.  相对于继承关系而言,进一步降低耦合度.

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

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

相关文章

双周赛114(模拟、枚举 + 哈希、DFS)

文章目录 双周赛114[2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)模拟 [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)哈希 枚举 [2871. 将数…

LeetCode-503-下一个更大元素Ⅱ

题目描述: 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数&am…

Docker--harbor私有仓库部署与管理

目录 一、Harbor简介 1、什么是Harbor 2、Harbor的特性 3、Haebor的构成 二、搭建本地私有仓库 1、本地私有仓库创建 2、将镜像上传至本地私有仓库 三、搭建Harbor仓库 1. 部署 Docker-Compose 服务 2、部署 Harbor 服务 3、启动Harbor 4、创建一个新项目 5、在其他…

Docker 容器管理

容器概念 docker容器相当于一个进程,性能接近于原生,几乎没有损耗; docker容器在单台主机上支持的数量成百上千; 容器与容器之间相互隔离; 镜像是创建容器的基础,可以理解镜像为一个压缩包 容器管理 …

并发、并行、同步、异步、阻塞、非阻塞

一、多核、多cpu (一)多核 Multicore 核是CPU最重要的部分。负责运算。核包括控制单元、运算单元、寄存器等单元。 多核就是指单个CPU中有多个核。 (二)多cpu Multiprocessor 多cpu就是一个系统拥有多个CPU。每个CPU可能有单个核…

5种排序算法

文章目录 一,排序算法时间复杂度比较二,插入排序三,冒泡排序四,快速排序五,堆排序六,二分归并排序 一,排序算法时间复杂度比较 算法最坏情况下平均情况下插入排序O(n )O(n)冒泡排序O(n)O(n)快速…

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商?

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商? 股票注册开户是非常简单的,在2015年前也就是互联网还不发达的时候,投资者只能去券商的营业部柜台办理,而自从各大券商都可以网上开户后,更多的投资者会选择网上开户…

【运维】一些团队开发相关的软件安装。

gitlab 安装步骤 (1) 下载镜像,并且上传到服务器 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (2)rpm -i gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (3)安装成功后…

观察者模式 行为型设计模式之七

1.定义 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样定义的:定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化&#xff0…

vue elementui <el-date-picker>日期选择框限制只能选择90天内的日期(包括今天)

之前也写过其他限制日期的语句,感觉用dayjs()的subtract()和add()也挺方便易懂的,以此记录 安装dayjs npm install dayjs --save dayjs().add(value : Number, unit : String); dayjs().add(7, day); //在当前的基础上加7天dayjs().subtract(value : N…

《TWS蓝牙耳机通信原理与接口技术》

+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 耳机BT与手机BT通信 主耳与从耳通信 耳机BLE盒手机BLE通信 充电盒与耳机通信 上位机与耳机通信 上位机与充电盒通信 1 耳机BT与手机BT通信 传输音频数据传递控制信息 (3) 耳机BLE与手机BLE通信 安卓/苹果app-耳机…

在硅云上主机搭建wordpress并使用Astra主题和avada主题

目录 前言 准备 操作 DNS解析域名 云主机绑定域名 安装wordpress网站程序 网站内Astra主题设计操作 安装主题 网站内avada主题安装 上传插件 上传主题 选择网站主题 前言 一开始以为云虚拟主机和云服务器是一个东西,只不过前者是虚拟的后者是不是虚拟的…

练[GYCTF2020]EasyThinking

[GYCTF2020]EasyThinking 文章目录 [GYCTF2020]EasyThinking掌握知识解题思路还得靠大佬正式开始 关键paylaod 掌握知识 ​ thinkphpV6任意文件操作漏洞,代码分析写入session文件的参数,源码泄露,使用蚁剑插件disable_functions绕过终端无回…

尚硅谷CSS学习笔记

什么是css css&#xff08;层叠样式表&#xff09; 它是一种标记语言&#xff0c;用于给HTML结构设置样式。简单理解css可以美化html&#xff0c;实现结构与样式的分离。 <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"&g…

【调度算法】快速非支配排序算法

这段代码实现的是快速非支配排序算法&#xff08;Fast Non-dominated Sorting Algorithm&#xff09;。 算法输入和输出&#xff1a; 这个函数的输入是两个列表 values1 和 values2&#xff0c;分别表示多目标优化问题中每个解在两个目标函数下的取值。输入的两个列表应该具有…

encoding/json vs json-iterator

encoding/json vs json-iterator 100% Compatibility 默认情况下&#xff0c;jsoniter 不会像标准库那样对映射键进行排序。如果你想要 100% 的兼容性&#xff0c;就这样使用 m : map[string]interface{}{"3": 3,"1": 1,"2": 2, } json : json…

线性代数 --- 矩阵的QR分解,A=QR

矩阵的QR分解&#xff0c;格拉姆施密特过程的矩阵表示 首先先简单的回顾一下Gram-Schmidt正交化过程的核心思想&#xff0c;如何把一组线性无关的向量构造成一组标准正交向量&#xff0c;即&#xff0c;如何把矩阵A变成矩阵Q的过程。 给定一组线性无关的向量a,b,c&#xff0c;我…

Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer)

文章目录 文章概述程序设计参考资料文章概述 Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer) 程序设计 Initialize virtual environment: conda create -n mmTrans python=3.7# -*- coding: utf-8 -*- import argparse import os

推荐高效的电脑磁盘备份解决方案!

该怎样实现电脑磁盘备份&#xff1f; 接下来&#xff0c;我们将为你介绍两种磁盘备份方法。一种是利用操作系统自带的功能&#xff0c;另一种则是通过第三方工具实现。 方法一. Windows自带的备份还原功能 要在Windows 11/10/8/7中备份软件&#xff0c;你可以使…

[代码学习]matmul的理解与使用

matmul 的理解与使用 引言&#xff1a;本实例以paddle框架中的matmul为例进行说明。torch和numpy中的matmul同理。 简介 PaddlePaddle中的matmul是一个矩阵乘法函数&#xff0c;可以用来实现两个矩阵的乘法操作。在PaddlePaddle的动态图模式下&#xff0c;可以用paddle.matmul…