面向对象六大设计原则--依赖倒置

目录

六大原则

定义

概念

Java语言中的表现

优点

在设计模式中体现

工厂方法模式

观察者模式

状态模式

示例

手机模块设计

五个示例

一、读取数据

二、发送消息

三、支付方式

四、日志记录

五、数据持久化

使用汽车驾驶进行说明

依赖的三种写法

1.构造函数传递依赖对象在类中通过构造函数声明依赖对象,按照依赖注入的说法,这种方式叫做构造函数注入,按照这种方式的注入,对IDriver和Driver进行修改。

2、Setter方法传递依赖对象

3、接口声明依赖对象

其他参考文章


最近准备把自己对于面向对象六大设计原则的学习心得进行梳理记录一下,以备后面查看。

六大原则

  1. 单一职责原则(Single Responsibility Principle):一个类应该只有一个引起变化的原因。这意味着一个类应该只负责一项功能或职责,这样当需求变化时,只需要修改或扩展这个类,而不需要修改它的原有代码。

  2. 开放封闭原则(Open Close Principle):软件实体应该对扩展开放,对修改封闭。这意味着当软件需要适应新的需求时,应该通过添加新的代码来扩展系统的行为,而不是修改已有的代码。

  3. 里氏替换原则(Liskov Substitution Principle):子类型必须能够替换其基类型。这意味着在软件中,如果使用基类型的地方都可以使用子类型,那么这个子类型就应该符合基类型的行为约定。

  4. 接口隔离原则(Interface Segregation Principle):客户端不应该依赖于它不使用的接口。这意味着接口应该小而专一,只提供客户端需要的方法,而不是提供一个庞大的接口让客户端依赖它不需要的方法。

  5. 依赖倒置原则(Dependency Inversion Principle):高层模块不应该依赖于低层模块的具体实现,而应该依赖于抽象。这意味着应该通过抽象(如接口或抽象类)来建立模块之间的依赖关系,从而降低耦合度。

  6. 迪米特法则(Law of Demeter):一个对象应该对其朋友使用的对象知道得最少。这表明一个对象应该尽可能少地了解其直接朋友(直接调用它的对象)之外的其它对象,以减少对象之间的耦合。

定义

概念

Dependence Inversion Principle,DIP(依赖倒置)

High level modules should not depend upon low level modules. Both should depend upon abstractions. (高层模块不应该依赖底层模块,两者都应该依赖抽象)

每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块(示例图如下图所示)

Abstractions should not depend upon details.(抽象不应该依赖于细节)

Details should depend upon abstractions (细节应该依赖于抽象)

但是根据依赖倒置原则,上图中的实现应该调整为

在Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化。

简单来说,核心思想就是针对接口编程,不要针对实现编程。把容易变换的部分,抽象成接口,以便于后续扩展。

相对于细节的多变性,科学合理的抽象要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在大多数软件设计中,抽象是指接口或抽象类,细节就是实现了接口或继承了抽象类的子类,使用接口或者抽象类的目的是定制好规范和契约,而不去涉及任何具体操作,把细节的展现任务交给他们的子类去实现。

尽可能的制定良好的抽象、接口规范,如果类之间如果要发生依赖,那么依赖于抽象接口更加稳定且利于扩展。

Java语言中的表现


模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
● 接口或抽象类不依赖于实现类;
● 实现类依赖接口或抽象类。

优点

采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

在设计模式中体现

工厂方法模式

不同的产品依赖于接口,不同的工厂依赖统一的接口

观察者模式

观察者依赖于统一接口,实现了update通知方法,提供被通知的行为

状态模式

不同的状态类依赖于统一的接口,实现了接口中抽象的共同行为,等待被传递及调用其他模式中的接口

示例

看到很多文章中有很好的示例,本文就不重复说明。

手机模块设计

面向对象五大设计原则-依赖倒置原则_依赖倒置原则的案例-CSDN博客 (通过手机模块设计来讲解依赖倒置,无代码实现)

五个示例

「干货」5个依赖倒置原则的例子及伪代码,让你成为编程高手

使用以下5个例子,来说明依赖倒置(具体内容见上文链接)

一、读取数据

二、发送消息

三、支付方式

四、日志记录

五、数据持久化

使用汽车驾驶进行说明

设计模式—— 三:依赖倒置原则_java倒置依赖的写法-CSDN博客

里面关于

依赖的三种写法

依赖是可以传递的,A对象依赖B对象,B又依赖C,C又依赖D——只要做到抽象依赖,即使是多层的依赖传递也是没有丝毫问题的。

对象的依赖关系有三种方式来传递,如下所示:


1.构造函数传递依赖对象
在类中通过构造函数声明依赖对象,按照依赖注入的说法,这种方式叫做构造函数注入,按照这种方式的注入,对IDriver和Driver进行修改。
public interface IDriver { 
  //司机就会开车
   public void drive(); 
}

public class Driver implements IDriver{
  private ICar car; 
  //构造函数注入 
  public Driver(ICar _car){ 
    this.car = _car; 
  }
  //司机的主要职责就是驾驶汽车 
  public void drive(){ 
    this.car.run(); 
  } 

}
2、Setter方法传递依赖对象

在抽象中设置Setter方法声明依赖关系,依照依赖注入的说法,这是Setter依赖注入,按照这种方式的注入,对IDriver和Driver进行修改:

public interface IDriver { 
  //车辆型号 
  public void setCar(ICar car);
 //是司机就应该会驾驶汽车
  public void drive(); 
}

public class Driver implements IDriver{
  private ICar car; 
  public void setCar(ICar car){ 
  this.car = car; 
  }

 //司机的主要职责就是驾驶汽车
 public void drive(){ 
   this.car.run();
  } 

}
3、接口声明依赖对象

在接口的方法中声明依赖对象,未修改的IDriver和Driver就采用了接口声明依赖的方式,该方法也叫做接口注入。

public interface IDriver { 
 //老司机,会开车
  public void drive(ICar car); 
}

public class Driver implements IDriver{
   //司机的主要职责就是驾驶汽车 
   public void drive(ICar car){ 
     car.run(); 
   } 
}

其他参考文章

Java新人常问:什么是依赖倒置原则?万字案例给你讲懂!-腾讯云开发者社区-腾讯云

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

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

相关文章

基于FPGA的温湿度检测

初始化部分就不过多赘述,我会给出对应的文件,我只说明这部分里面涉及到使用的代码部分 1、数据的读取和校验 数据的读取和检验代码如下 always (posedge clk_us)if (data_temp[7:0] data_temp[39:32] data_temp[31:24] data_temp[23:16] data_te…

SQLite3的使用

14_SQLite3 SQLite3是一个嵌入式数据库系统,它的数据库就是一个文件。SQLite3不需要一个单独的服务器进程或操作系统,不需要配置,这意味着不需要安装或管理,所有的维护都来自于SQLite3软件本身。 安装步骤 在Linux上安装SQLite…

AI数据分析:集中度分析和离散度分析

在deepseek中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下: 读取Excel表格:"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx&qu…

【PADS】软件下载安装、PADS—Altium Designer文件转换

PADS软件学习——软件下载、安装、解析 一、软件下载 PADS:链接:https://pan.baidu.com/s/1J9z-Rl9sLjfnZYwlE3ZLPQ?pwdGLNG 提取码:GLNG解析软件:http://mentor.mr-wu.cn/PADS教学视频:https://www.bilibili.com/v…

“硝烟下的量子”:以色列为何坚持让量子计算中心落地?

自2023年10月7日新一轮巴以冲突爆发以来,支持巴勒斯坦伊斯兰抵抗运动(哈马斯)的黎巴嫩真主党不时自黎巴嫩南部向以色列北部发动袭击,以军则用空袭和炮击黎南部目标进行报复,双方在以黎边境的冲突持续至今。 冲突走向扑…

Django教程(001):安装及快速上手

1.1 Django安装 pip install django安装之后 c:\python39-python.exe-Scripts-pip.exe-django-admin.exe【安装django之后,工具,创建django项目】-Lib-内置模块-site-packages-flask-django(安装django之后,【django框架源码】)如下图&…

springboot 网上商城系统-计算机毕业设计源码08789

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设网上商城系统。 本设…

HTTPS 代理的优点和缺点是什么?

HTTPS(超文本安全传输协议)作为一种基于HTTP加上SSL安全层的网络通信协议,已经成为互联网上广泛使用的IP协议之一。它在保证信息安全和隐私方面具有很多优势,但也存在一些缺点。接下来,我们就来探究一下HTTPS协议的优缺…

导致代理IP延迟高的原因

很多用户在使用代理IP进行网络访问时,可能会遇到代理IP超时的情况,也就是代理IP的延迟过高。代理IP延迟过高会影响用户的网络体验和数据获取效率。因此,了解代理IP延迟过高的原因很重要。以下是导致代理IP延迟过高的一些常见原因:…

相位和展开相位

相位 (Phase) 相位是一个周期信号在一个周期内的位置,通常以角度(度或弧度)表示。在许多应用中,相位被限制在一个周期内。例如,相位通常被限定在 −180∘到 180∘ 或 0∘ 到 360∘ 之间。 示例 −90∘ 表示信号在周…

fvcore库的一些功能和使用

目录 一、安装fvcore库 二、使用 fvcore是Facebook开源的一个轻量级的核心库,它提供了各种计算机视觉框架中常见且基本的功能。其中就包括了统计模型的参数以及FLOPs等。 项目地址:fvcore 一、安装fvcore库 pip install fvcore 二、使用 1、计算模…

【实物资料包】基于STM32智能台灯设计

【实物资料包】基于STM32智能台灯设计 需要资料的请在文章结尾获取哦~~~~(如有问题私信我即可) 1.介绍 1 添加wifi模块模块,可通过wifi模块APP或者手动按钮切换自动/手动模式 2 自动模式下,台灯可以感应是否有人落座&#xff0…

干货 | 准备换ERP系统?来看看这篇文章!

当前客户的痛点 在当今竞争激烈的市场环境中,企业面临着诸多挑战和痛点,尤其是在管理和运营方面。让我们以一家中小型制造业企业为例,探讨他们所面临的主要痛点: 分散的数据管理:企业各部门之间信息孤岛严重&#xff…

Ci2451和Ci2454:2.4GHz无线MCU的芯片对比数据资料分析

一、2.4GHz无线MCU芯片的背景介绍 1、开头我们先聊聊,关于南京中科微2.4GHz无线MCU芯片(Ci2451、Ci2454、CSM2433)是建立在现有的2.4GHz射频芯片基础上面,它的内部是集成了8位RISC内核,且集成丰富的MCU资源、更小的尺寸可以来满足…

iPhone卡在恢复模式无法退出时,有那些退出恢复模式方法?

iPhone用户有时会遇到需要将手机进入恢复模式的情况。恢复模式可以帮助解决一些软件问题,但如果iPhone卡在恢复模式,不知道如何退出就会非常麻烦。小编将介绍几种iPhone退出恢复模式的方法。 一、苹果手机的恢复模式是什么意思 iPhone的恢复模式是针对i…

React的生命周期函数详解

import React,{Component} from "react";import SonApp from ./sonAppclass App extends Component{state{hobby:爱吃很多好吃的}// 是否要更新数据,这里返回true才会更新数据shouldComponentUpdate(nextProps,nextState){console.log("app.js第一步…

快速排序的实现(3种)

目录 0.快速排序1.Hoare版本1.1基本思想1.2算法描述1.3画图解释1.4问题?1.5代码实现 2.挖坑法2.1算法描述2.2画图解释2.3代码实现 3.先后指针法3.1算法描述3.2画图解释3.3代码实现 4.优化4.1优化方法4.2优化代码 5.非递归实现快排5.1算法描述 0.快速排序 1.时间复杂…

AGV选型要点及步骤,保证企业选择的AGV小车更实用

AGV AGV小车作为智能化物流仓储不可或缺的工具,在制造业得到了广泛的应用,市场需求呈现出井喷式增长。但是AGV市场还存在着很多问题,制造企业在产品选型时往往缺乏正确的引导。 AGV智能仓储 毫无疑问,我们的自动化物流系统已离不开AGV小车了,…

Spring Boot + Vue 全栈开发,都需要哪些前端知识?

Node.js默认安装的npm包和工具的位置:Node.js目录\node_modules 在这个目录下你可以看见 npm目录,npm本身就是被NPM包管理器管理的一个工具,说明 Node.js已经集成了npm工具 #在命令提示符输入 npm -v 可查看当前npm版本 npm -v 二、使用n…

【Android】Android Studio 使用Kotlin写代码时代码提示残缺问题解决

问题描述 Android Studio升级之后,从Android Studio 4.2升级到Android Studio Arctic Fox版本,因为项目比较老,使用的Gradle 版本是3.1.3,这个版本的Android Studio最低支持Gradle 3.1版本,应该算是比较合适的版本。 …