当前位置: 首页 > news >正文

我终于读懂了设计模式的七大原则。。。

文章目录💥

    • 🐒设计模式的目的
    • 🐴什么叫单一职责原则?
    • 🐤什么叫接口隔离原则?
    • 🐫什么叫做依赖倒转原则?
    • 🐑什么是里氏替换原则?
    • 🐘什么叫开闭原则?
    • 🐼什么叫迪米特法则?
    • 🐍什么叫合成复用原则?
    • 🐔设计原则核心思想

🐒设计模式的目的

设计模式是为了让程序,具有更好

  1. 代码重用性 (即:相同功能的代码,不用多次编写)
  2. 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
  3. 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
  4. 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)

设计模式常用的七大原则有:

  1. 🐴单一职责原则
  2. 🐤 接口隔离原则
  3. 🐫依赖倒转(倒置)原则
  4. 🐑里氏替换原则
  5. 🐘开闭原则
  6. 🐼迪米特法则
  7. 🐍合成复用原则

🐴什么叫单一职责原则?

一个类应该只负责一项职责

正常的代码

在这里插入图片描述
在方式 1 的 run 方法中,违反了单一职责原则

解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可

在这里插入图片描述

方案 2 的分析

遵守单一职责原则,但是这样做的改动很大,即将类分解,同时修改客户端
改进:直接修改 Vehicle 类,改动的代码会比较少=>方案 3

在这里插入图片描述
方案 3 的分析

这种修改方法没有对原来的类做大的修改,只是增加方法
这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责

单一职责原则注意事项和细节

  1. 降低类的复杂度,一个类只负责一项职责。
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

🐤什么叫接口隔离原则?

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

正常的代码

在这里插入图片描述

这样浪费了太多不用的接口

在这里插入图片描述

我们要遵循的原则:只实现改实现的接口,将接口中的类隔离出来

🐫什么叫做依赖倒转原则?

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转(倒置)的中心思想是面向接口编程
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java 中,抽象指的是接口或抽象类,细节就是具体的实现类
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

在这里插入图片描述
方式 1 分析

  • 简单,比较容易想到
  • 如果我们获取的对象是 微信,短信等等,则新增类,同时 Perons 也要增加相应的接收方法
  • 解决思路:引入一个抽象的接口 IReceiver, 表示接收者, 这样 Person 类与接口 IReceiver 发生依赖,因为 Email, WeiXin 等等属于接收的范围,他们各自实现 IReceiver 接口就 ok, 这样我们就符合依赖倒转原则
    在这里插入图片描述

依赖倒转原则的注意事项和细节

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好.
  2. 变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
  3. 继承时遵循里氏替换原则

🐑什么是里氏替换原则?

子类中尽量不要重写父类的方法

在这里插入图片描述
分析

  • 我们发现原来运行正常的相减功能发生了错误。原因就是类 B 无意中重写了父类的方法,造成原有功能出现错误。在实际编程中,我们常常会通过重写父类的方法完成新的功能,这样写起来虽然简单,但整个继承体系的复用性会比较差。特别是运行多态比较频繁的时候
  • 通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉,采用依赖,聚合,组合等关系代替.
    在这里插入图片描述

🐘什么叫开闭原则?

当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化 对扩展开放(对提供方),对修改关闭(对使用方)

在这里插入图片描述
违反了设计模式的 ocp 原则,即对扩展开放(提供方),对修改关闭(使用方)。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.

在这里插入图片描述
思路:把创建 Shape 类做成抽象类,并提供一个抽象的 draw 方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承 Shape,并实现 draw 方法即可,使用方的代码就不需要修-> 满足了开闭原则

🐼什么叫迪米特法则?

  1. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的
    public 方法,不对外泄露任何信息
  2. 迪米特法则还有个更简单的定义:只与直接的朋友通信
  3. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

在这里插入图片描述

  1. 前面设计的问题在于 SchoolManager 中,CollegeEmployee 类并不是 SchoolManager 类的直接朋友(分析)
  2. 按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合
    在这里插入图片描述
    迪米特法则注意事项和细节
  • 迪米特法则的核心是降低类之间的耦合
  • 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系

🐍什么叫合成复用原则?

原则是尽量使用合成/聚合的方式,而不是使用继承

🐔设计原则核心思想

  1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
  2. 针对接口编程,而不是针对实现编程。
  3. 为了交互对象之间的松耦合设计而努力

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

相关文章:

  • 小程序为什么必须安装SSL证书?怎么挑选?——建议收藏
  • AHB传输---突发操作
  • Altera FPGA 配置flash读写
  • web页面点击右键显示按钮
  • zabbix6.4告警配置(短信告警和邮件告警),脚本触发
  • mac资源库的东西可以删除吗?提升Mac运行速度秘籍 Mac实用软件
  • 【React架构 - Scheduler中的MessageChannel】
  • InnoDB高级特性篇(5)-使用InnoDB的全文索引
  • 动态获取权限,文件管理器选择文件,I/O流
  • 第十三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure的Face API开发人脸识别门禁系统经典案例
  • 【坑】Spring Boot整合MyBatis,一级缓存失效
  • spark基础
  • stm32f4xx-SPI
  • 高数(下) 第十二章:无穷级数
  • LeetCode·每日一题·940.不同的子序列 || · 动态规划
  • 【云原生】Elasticsearch + kibana on k8s 讲解与实战操作
  • 神经网络过拟合什么意思,神经网络中解决过拟合
  • win11toast:python桌面通知工具
  • 【cloud Alibaba】(四)分布式事务处理——Seata
  • [算法入门笔记] 19. 有序表
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • Java反射小练之手写BeanUtils的copyProperties(Upgrade)
  • 软件测试过程:单元测试,集成测试,系统测试,验收测试,回归测试
  • 入门力扣自学笔记177 C++ (题目编号:769)
  • QT中QThread的各个方法,UI线程关系,事件关系详解(5)
  • 深度学习:LeNet-5实现服装分类(PyTorch)
  • 核酸系统架构设计
  • 基于Matlab模拟、检测和跟踪飞机着陆进场中异常的仿真(附源码)
  • 面试官:服务端推送到Web前端有哪几种方式?
  • selenium使用篇_键盘鼠标事件
  • Java第17章 - I/O流(一)
  • STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)