设计模式——六大设计原则详解

 什么是设计模式

        随着编程的发展,程序员们发现再解决一些普遍的问题的时候,所使用的解决方案是大体相同的。这些解决方法是众多程序员经过长时间的实践和试错最终总结出来了。所有就有人将它们总结起来形成了设计模式。设计模式出现的意义是为了重用代码,让代码更容易被人理解、保证了代码的可靠性。如果我们能熟练的掌握这些设计模式,我们就能完美的解决开发时的大多数问题。让代码更加优雅。这就是我们要了解、学习设计模式的原因。

优点:

  • 当设计模式中的一些专业名词被大家了解,则当开发人员在讨论项目时交流更加高效,更好理解对方的想法。
  • 提供了经过验证的解决方案,提高了软件的可维护性(在遇到错误时可以从网上寻求解决方案)、可复用行和灵活性。
  • 促进了代码的重用,避免的重复的设计和实现。
  • 通过遵循设计模式,可以减少开发过程中遇到的错误和问题,提高代码质量。

但在学习具体的设计模式之前,我们要先了解学习设计模式的六大设计原则

1、单一职责原则

        单个类职责统一,不要将所有功能都放在一个类上去实现。类中方法一个方法只做一件事。所谓的职责单一其实是指当前类所承担的业务是最小颗粒,而完整的业务是这些颗粒组合、互相调用实现的,我们要将职责划分清楚。对于具体如何划分要根据业务需求和个人经验能力来决定。它有一些基础的原则:

  • 两个功能完全不同的方法不应该写再同一个类当中。
  • 一个类应该是一组相关性很高的数据和方法的包装。

举例:再购买一个东西,它有原价,和各种的优惠政策,最后得到了现价。我们不能把优惠策略方法和原价这些方法写到一个类当中,而是将其分开类写,当优惠政策改变时只需要开动优惠政策那的方法。只需要原价传入优惠的方法即可。

2、开闭原则

        类的设计对扩展开放,对修改关闭。增加功能时尽可能的使用扩展,而不是使用修改原有的代码达到目的。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

        例:对于一个商品类我们有一个获取价格(getPrice())的方法,但当它需要打折时,我们想到的是增加一个子类,重写它的getPrice()方法。这时打折用其子类就行了,更加灵活。

3、里氏替换原则

所有引用基类的地方,必须能使用其子类进行替换。

在面向对象的继承关系当中,只要父类出现的地方子类就可以出现,将其替换为子类不会出现任何错误或异常。使用者可能根本不需要知道是父类还是子类,但反过来就不行了,有子类出现的地方,父类未必能适应。子类可以替换父类,且不是功能发生改变。

规范:

  1. 子类必须完全实现父类的方法。
  2. 子类可以有自己的个性(重写)。
  3. 覆盖或者实现父类方法的时候,输入参数可以被放大(如:父类参数为HashMap,子类参数可以变为Map)
  4. 方法返回值子类要比父类更加严格,(如:父类:Map,子类返回可以为HashMap)。

4、接口隔离原则

        使用多个隔离接口比使用单个接口要好。也就是降低类之间的耦合度。由此可见其实设计模式就是从大型软件建构出发、便于升级和维护的软件设计思想,它强调降低依赖、降低耦合。

        具体来说就是接口粒度尽量小,对于相同职责的接口方法进行分组,尽量一个接口只给一个子模块或者业务使用,但不要太过于细化,不然结构会过于复杂。

规范:

  1. 接口尽量小
  2. 接口要高内聚:提高接口、类、模块的处理能力,减少对外交互,要求在接口中尽量少公布public方法,减少对外承诺也利于降低成本
  3. 定制服务,针对不同的用户提供不同的服务,只提供访问者需要的方法。如给不同权限的用户提供不同的接口操作。

5、依赖倒置原则

上层模块不应该依赖下层模块,而是应该通过接口交互。不可分割的原子逻辑就是下层模块,而下层模块组装起来的就是上层模块,这样的话当上层有变化的时候,下层不会有感知修改。

这就是面向接口编程,是面向对象设计的精髓之一,可以减少类之间的耦合度,提高系统的稳定性,减低并行开发引起的风险。

规范:

  1. 模块之间依赖通过接口或抽象类发生,实现类之间不能直接依赖
  2. 接口和抽象类不依赖实现类
  3. 实现类依赖于接口或抽象类

6、迪米特原则(又称:最少知道原则)

        顾名思义,就是一个实体类应当对其他对象要尽量少了解,尽量的与其他实体类之间发生相互作用。对类之间要低耦合。使系统功能模块相对独立。

例(结合实例):

  1. 领导下发任务,只需和组长讲明需求即可,与组员说明的工作由组长来完成。
  2. 组员之间工资信息不能互相透露,不然修改一个人的工资,对其他组员工作积极性有影响,都要调动。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis操作数据库常用用法总结1

文章目录 1.单表查询1.1返回所有的表记录1.2根据id查找结果1.3根据名字查找结果 2.单表修改2.1修改密码 3.单表删除3.1根据id删除信息 4.单表增加(根据业务情况返回)4.1添加返回影响的行数4.2添加返回影响行数和id 5.多表查询(多)…

【容器化】Oceanbase镜像构建及使用

通过该篇文章可以在国产X86-64或ARM架构上构建商业版oceanbase,只需要替换pkg安装包即可。下面截图主要以国产X86-64安装为例,作为操作截图: 镜像构建目录说明 pkg:用来存放安装包及脚本,抛出rpm其他是脚步,这些rpm包…

伪原创神码ai怎么样【php源码】

这篇文章主要介绍了python汉化补丁包下载,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图: ** Spyder汉化(python汉化&…

解锁滴滴ES的性能潜力:JDK 17和ZGC的升级之路

前文介绍了滴滴自研的ES强一致性多活是如何实现的,其中也提到为了提升查询性能和解决查询毛刺问题,滴滴ES原地升级JDK17和ZGC,在这个过程中我们遇到了哪些问题,怎样解决的,以及最终上线效果如何,这篇文章就…

软考高级之系统架构师之数据通信与计算机网络

概念 OSPF 在划分区域之后,OSPF网络中的非主干区域中的路由器对于到外部网络的路由,一定要通过ABR(区域边界路由器)来转发,既然如此,对于区域内的路由器来说,就没有必要知道通往外部网络的详细路由,只要由…

[系统安全] 五十二.DataCon竞赛 (1)2020年Coremail钓鱼邮件识别及分类详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

MyCat配置rule.xml、server.xml讲解

1. rule.xml分片规则配置文件 rule.xml中配置的主要就是拆分表的规则,rule.xml中主要包含两类标签 tableRule 和Function。 tableRule标签里面主要配置我们的分片规则,Function里面涉及的是分片规则里面所涉及的java类,都是在function中配置…

学习笔记-JAVAJVM-JVM的基本结构及概念

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 什么是JVM 原文连接: 原文连接 JVM是J…

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材 下载地址:https://download.csdn.net/download/Highning0007/88204017

2023年10款常用的Mac工具合集

Typora Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器,与其他 Markdown 编辑器不同的是,Typora 没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的功能,但也可切换至源代…

关于Postman如何配置随请求携带token

文章目录 一些吐槽实际应用 一些吐槽 首先吐槽一下 postman官网的文档说明,真是乱七八糟,一点都不清晰,能不能好好写用户手册啊(比如把用户都当作初始小白) 然后吐槽一下网上铺天盖地让我写js脚本应用全局access toke…

uniapp开发小程序-分包(微信错误码:800051)

在使用uniapp开发小程序时,上传的时候因为文件过大,显示上传失败。 以下是开发过程中遇到的问题及解决方法: 1. 问题一:因为文件过大,显示上传失败 ①尝试过把本地使用的图片压缩到最小; ②把图片转换为网…

火山引擎联合Forrester发布《中国云原生安全市场现状及趋势白皮书》,赋能企业构建云原生安全体系

国际权威研究咨询公司Forrester 预测,2023年全球超过40%的企业将会采用云原生优先战略。然而,云原生在改变企业上云及构建新一代基础设施的同时,也带来了一系列的新问题,针对涵盖云原生应用、容器、镜像、编排系统平台以及基础设施…

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发,前端Layui,数据库mysql,是一款实用的企业办公系统。可多角色登录,集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…

机器学习深度学习——常见循环神经网络结构(RNN、LSTM、GRU)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——RNN的从零开始实现与简洁实现 📚订阅专栏:机器学习&&深度学习 希望文章…

4用opencv玩转图像2

opencv绘制文字和几何图形 黑色底图 显示是一张黑色图片 使用opencv画圆形 #画一个圆 cv2.circle(imgblack_img,center(400,400),radius100,color(0,0,255),thickness10) 画实心圆 只需要把thickness-1。 cv2.circle(imgblack_img,center(500,600),radius50,color(0,0,255),t…

JS逆向系列之猿人学爬虫第11题 - app抓取 - so文件协议破解

题目地址 http://match.yuanrenxue.com/match/11这是个app题目,先下载下来安装到测试手机上 安装完成后的app界面长这样 打开之后是这样的: 要求已经简单明了了。 二话不说先反编译app 不出意外的是没出意外,源代码里面没啥混淆,所有东西都展示的明明白白的。 "…

Apache Maven:从构建到部署,一站式解决方案

目录 一、Maven介绍 1. Maven是什么? 2.Maven的作用? 二、Maven仓库介绍 2.1 库的分类 三、Maven安装与配置 3.1 Maven安装 3.2 Maven环境配置 3.3 仓库配置 四、Eclipse与Maven配置 五、Maven项目测试 5.1 新建Maven项目步骤及注意事项 5.…

【LeetCode】236. 二叉树的最近公共祖先、 JZ36 二叉搜索树与双向链表

作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 题目描述: 给定一个二叉树…

为MySQL新增一张performance_schema表 | StoneDB 技术分享会 #4

StoneDB开源地址 https://github.com/stoneatom/stonedb 设计:小艾 审核:丁奇、李浩 编辑:宇亭 作者:王若添 中国科学技术大学-软件工程-在读硕士、StoneDB 内核研发实习生 performance_schema 简介 MySQL 启动后会自动创建四…