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

news2024/10/6 20:28:40

目录

六大原则

定义

概念

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

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

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

相关文章

从0开始C++(一):从C到C++

目录 c的基本介绍 C语言和C 的区别 面向过程和面向对象的区别 引用 引用使用的注意事项 赋值 终端输入 cin getline string字符串类 遍历方式 字符串和数字转换 函数 内联函数 函数重载overload 小练习: 参考代码 c的基本介绍 C是一种通用的高级编…

学习金字塔模型

学习金字塔模型由美国缅因州巴特尔教育研究所(National Training Laboratories, Bethel, Maine)开发,它展示了不同学习活动的平均知识保留率。这种方法可以帮助人们理解不同学习方式的有效性,从而更好地选择适合的学习方法。学习金…

数据库断言-数据库更新

数据库更新的步骤和查询sql的步骤一致 1、连接数据库 驱动管理器调用连接数据库方法(传入url,user,password),赋值给变量 2、操作数据库 connection调用参数化方法,对sql语法进行检查,存储s…

新质生产力潮水里:谁在为中小企业搭起一座桥?

与其说华为云为中小企业提供的是一个个更具性价比和产业适配度的产品,更本质来看,其通过618营销季为中小企业提供了一个数字化转型升级的契机,基于此,企业可以在云计算和AI时代实现内在变革,焕发新的生机与活力。 作者…

Tomcat get请求传数组集合参数

前言 最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢&#xf…

微软将停用 App Center:React Native 开发人员应该使用以下工具

再见,应用中心!你好,EAS + Sentry + GitHub Actions! React Native 开发人员大遗憾:微软宣布将于 2025 年 3 月 31 日关闭Visual Studio App Center。 多年来, Infinite Red一直将 App Center 作为许多 React Native 咨询客户的 CI/CD 流程和开发工作流程的关键部分。它有…

零基础MySQL完整学习笔记

零基础MySQL完整学习笔记 1. 基础操作(必须会!)1.1 修改密码(4种方法)1.2 创建新用户1.3 导入数据库 2. SQL四种语言介绍2.1 DDL(数据库定义语言)2.2 DML(数据操纵语言)2.3 DCL(数据库控制语言)2.4 TCL(事务控制语言) 3. 数据库操作3.1 创建数据库3.2 查询数据库3.3 删除数据库…

SpringCloud分布式微服务链路追踪方案:Zipkin

创作博客的目的是希望将自己掌握的知识系统地整理一下,并以博客的形式记录下来。这不仅是为了帮助其他有需要的人查阅相关内容,也是为了自己能够更好地巩固和加深对这些知识的理解。创作的时候也是对自己所学的一次复盘和总结,在创作的过程中…

python爬虫需要什么HTTP代理?

用来爬虫的话,还是建议用高匿名代理,但显然题主用了高匿名代理还是出现了一部分问题,我们可以先找到问题关键再解决它,一般爬虫用了高匿名代理出现被封会有以下几种原因: 1.代理IP的质量不过关 一般来说每个网站都有…

AI写文章生成器,这些工具都可以一键智能生成文章

在AI技术快速发展的今天,AI写作生成器成为我们创作内容的重要工具,它可以提高我们的写作效率,节省时间和精力。下面小编就来和大家分享几款优秀的AI写作生成器,帮助你快速生成高质量的文章。 1.专业AI写作工具-文章在线生成器 专…

ChatGPT对那些带有残疾迹象的简历有偏见——但它可以改善

ChatGPT对那些带有残疾迹象的简历有偏见——但它可以改善 去年,华盛顿大学(University of Washington)研究生凯特•格拉兹科(Kate Glazko)在寻找研究实习机会时注意到,招聘人员在网上发布消息称,他们使用OpenAI的ChatGPT和其他人工智能工具来…

如何模拟一个具有网络管理功能的被测件的一些思路

不知道大家有没有遇到过这个问题? 当我们在学习如何测试网络管理时,难题不在于如何编写测试脚本,而是编写完测试脚本后,没有真实被测件来让我们执行测试脚本,进而调试脚本。这也是我在给大家讲CANoe工具和CAPL编程语言…

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点,一是组件的状态切换与buffer的流转过程,这部分内容我们已经在IL Spec中学习过了;二是OMX组件使用的buffer类型与buffer分配过程,这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的,这些和漂流都关联不上,直到最近看了一些网站,发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面: 稳重和专业感: 政务类网站需要给人以稳重、正…

c++分隔字符串

可以使用getline函数。 有两个版本: 至于为什么可以使用getline函数返回值作为while的判断条件,cprimer中表述如下:

51-60 CVPR 2024 最佳论文 | Generative Image Dynamics

在2023年11月,谷歌研究院发布了一项令人瞩目的研究成果——Generative Image Dynamics(生成图像动力学)。这项技术的核心是将静态的图片转化为动态的、无缝循环的视频,而且更令人兴奋的是,这些生成的视频还具有交互性。…

【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )

文章目录 一、" 事件 " 开发步骤1、" 事件 " 开发步骤2、完整代码示例 二、常见鼠标 " 事件 "1、常见鼠标 " 事件 "2、鼠标 " 事件 " 代码示例 Web APIs 博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla…

计算机组成原理 | CPU子系统(1)基本概述

基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么?属于那个结构里? 时序处理部件 cpu是大脑,控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频(系统时钟信号),…

Springboot整合cxf进行WebService发布和WebService调用

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** 测试接口 author Μr.ηobοdy date 2019-12-29 */ WebService(name “UserService”, // 暴露服务名称 targetNamespace “http://servic…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…