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

news2024/7/6 19:25:19

 什么是设计模式

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

优点:

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

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

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. 组员之间工资信息不能互相透露,不然修改一个人的工资,对其他组员工作积极性有影响,都要调动。

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

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

相关文章

玩转Pandas_TA:一站式掌握技术分析指标

01 引言 Pandas_TA —— 一个结合了pandas的强大数据处理能力与技术分析的库,旨在为金融市场分析师和交易者提供一个简单、高效的工具集,从而帮助他们更容易地在数据集上应用各种技术分析指标。pandas_ta为用户提供了直接在DataFrame上运行技术指标计算的…

gitlab 503 错误的解决方案

首先使用 sudo gitlab-ctl status 命令查看哪些服务没用启动 sudo gitlab-ctl status 再用 gitlab-rake gitlab:check 命令检查 gitlab。根据发生的错误一步一步纠正。 gitlab-rake gitlab:check 查看日志 tail /var/log/gitlab/gitaly/current删除gitaly.pid rm /var/opt…

Go的任务调度单元与并发编程

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 本文主要介绍Go语言、进程、线程、协程的出现背景原因以及Go 语言如何解决协程的…

Idea添加mybatis的mapper文件模版

针对Java开发人员,各种框架的配置模版的确是需要随时保留一份,在使用的时候,方便复制粘贴,但是也依然不方便,我们可以给开发工具(IDE)中添加配置模版,这里我介绍下使用idea开发工具&…

安达发|APS排程软件与某一知名APS软件整体对比

APS排程软件作为高级计划与排程系统。主要是解决小批量、多品种的复杂生产要求。客户的要求交期越来越准。由于成本不断攀升,所以高产出和低成本也是重要的考量因素。 下面我们就安达发APS软件与某一知名APS做一下整体对比: 1.功能实用性 安达发APS排…

记录--前端重新部署如何通知用户

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 场景 前端构建完上线,用户还停留还在老页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能…

springboot 对接 minio 分布式文件系统

1. minio介绍 Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象…

计算机视觉大牛Liang-Chieh Chen从谷歌离职!加入字节跳动!

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【图像分割和论文投稿】交流群 这应该是国内首次报道! Amusi 发现:Liang-Chieh Chen 巨佬在官网宣布:已离职谷歌,目前在字节跳…

以太网Ethernet通信协议

一、以太网简介 计算机网络可分为局域网(LAN)、 城域网(MAN)、广域网(WAN)、互联网(Initernet)。局域网按传输介质所使用的访问控制方法可分为:以太网(Ethernet)、光纤分布式数据接口(FDDI)、异步传输模式(ATM)、令牌环网(Token Ring)、交换网(Switching) 等&#x…

【JavaSE】什么是抽象类?什么是内部类?以及它们的作用是什么?

这篇文章我们主要学习的是两个知识点,可以来解决文章标题所提出来的三个问题。 目录 1.抽象类 1.1 抽象类概念 1.2 抽象类语法 1.3 抽象类特性 1.4 抽象类的作用 2.内部类 2.1 内部类的分类 2.2 实例内部类 2.3 静态内部类 2.4 匿名内部类 2.5 局部内部类…

标准化归一化 batch norm, layer norm, group norm, instance norm

Layer Normalization - EXPLAINED (in Transformer Neural Networks) Layer Normalization - EXPLAINED (in Transformer Neural Networks) 0~4min:什么是multi-head attention 5~7min:layer norm图示 7~9min:公式举例layer norm 9:54-end:layer norm的代码示例 group n…

2023金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer?还是多少万年薪?其实这些都离不开日积月累的过程。 为此我特意整理出一份(超详细笔记/面试题)它几乎涵盖了所有的测试开发技术栈,非常珍贵,人手一份 肝完进大厂 妥妥的&#…

时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆…

用队列实现栈——数据结构与算法

😶‍🌫️Take your time ! 😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥代码仓库:🔥🔥魔…

【JS交互篇】DOM操作基础

一、DOM概述 1.1 什么是DOM DOM(Document Object Model)文档对象模型,用来表示和操作html或xml文档内容的基础API;当网页被加载时,浏览器会创建页面的文档对象模型DOM,而DOM模型被构造为对象的树(Dom Html Tree);DOM包…

真我V3 5G(RMX2200 RMX2201)解锁刷机全过程

安卓系统新Rom包为GSI,更具有通用性,可以比较放心刷。 原厂系统垃圾多、广告多,甚至热点功能不支持ipv6,严重偏离热点机的定位。 主要参考 https://www.bilibili.com/read/cv20730877/https://www.bilibili.com/read/cv2073087…

DSV-080-2NCP-N-MM两位两通常闭先导式电磁阀

该插装阀具有正向关断作用,设计用于负荷保持状态。 动作状况 断电时,DSV -080-2NCP-*-M*为止回阀,允许介质从1到2,同时阻止介质从2到1。 通电时,提升阀提升,打开从 2到1的通通道。 手动关闭选择:按下按…

分布式协议与算法——CAP理论、ACID理论、BASE理论

CAP理论 CAP理论,对分布式系统的特性做了高度抽象,比如抽象成了一致性、可用性和分区容错性,并对特性间的冲突(也就是CAP不可能三角)做了总结。 CAP三指标 CAP理论对分布式系统的特性做了高度抽象,形成了…

境内金融信息服务报备33家机构名单

2022年01月04日,国家互联网信息办公室关于发布第一批境内金融信息服务机构报备编号的公告,公开发布第一批20家金融信息服务机构的名称及报备编号。 2022年10月28日,国家互联网信息办公室关于发布第二批境内金融信息服务机构报备编号的公告&am…