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

目录

六大原则

定义

概念

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.rhkb.cn/news/359815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毫米波移动通信系统中的波束赋形— 基于码本的波束训练

基于码本的波束训练算法该方法在收发端都配置波束矢量的码本,通过波束搜索的方式发现最优的波束方向为了加快波束搜索的速度,往往采用逐步缩小搜索范围的方式加快搜索,可以将搜索算法的时间复杂度从O(N)降低到O(logN),其中N表示码…

AI绘画Stable Diffussion 实操教程: 真人图片秒变动漫风,亲手绘制你的专属动漫头像

大家好,我是向阳 你是否曾幻想过自己置身于动漫世界,拥有那些令人羡慕的二次元特征?随着人工智能技术的飞速发展,这一幻想已不再遥不可及。在本文中,我们将一起揭开Stable Diffusion技术的神秘面纱,探索如…

海南聚广众达电子商务咨询有限公司抖音开店怎么样?

在数字化浪潮汹涌的当下,电商行业正迎来前所未有的发展机遇。作为抖音电商服务领域的佼佼者,海南聚广众达电子商务咨询有限公司凭借其专业的服务团队和前瞻的战略眼光,成为了众多品牌和商家在抖音平台上实现业务增长的重要合作伙伴。今天&…

Mac清理系统数据小技巧,告别卡顿烦恼 苹果电脑清理内存怎么清理

任何使用Mac的用户都会同意:没有什么比一台运行缓慢的电脑更能消磨人的耐心了。那些无休止的彩球旋转、程序响应迟缓、突然的系统冻结,这一切都让人想抓狂!但别担心,这里有一些简单的Mac清理系统数据小技巧和CleanMyMac X的神助攻…

养车小程序系统源码,汽修源码,仿途虎养车系统源码,车辆保养小程序系统

用户端+商家端+师傅端 功能介绍: 支持下单上门服务、到店核销,支持单独选择项目、 也支持选择服务人员、和选择门店多种下单方式, 支持上门服务和到店核销两种服务方式,支持自营和多商家联营两种运营模式&#xff…

编译原理大题自解(活前缀DFA、LR(0)分析表)

目录 4. (简答题) (1)给出识别活前缀的DFA (2)设计此文法的 LR(0)分析表 第一种解法 第二种解放 首先声明这是作者的写法(不保证正确!)仅供参考。本题因为可能存在冲突的原因,所…

centos 7无需token编译安装freeswitch 1.10.11 ——筑梦之路

准备工作 安装编译工具和依赖包 yum update -y sudo yum install epel-release vim tcpdump net-tools.x86_64 -y sudo yum install gcc-c sqlite-devel zlib-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel openssl-devel git -y yum install yasm n…

强化安全新篇章:韶关石油化工可燃气体报警器年检解析

韶关,这座位于广东省北部的城市,近年来在石油化工行业取得了显著的发展。 随着一批批大型石化企业的进驻和投产,韶关不仅成为了区域性的石化产业基地,也为地方经济带来了强劲的增长动力。 然而,随着石化产业的快速发…

RTX5全家桶源码综合模板发布,含FreeRTOS内核版本,将其打造成直接面向实际项目应用的综合框架(2024-06-19)

【说明】 1、RTX5全家桶的优势就是简单易用,初学的话,上手很快,稳定性也是杠杠的,且容易做稳定。 2、同时RTX5也是有汽车级,工业级,医疗和铁路安全认证,只是安全级别比ThreadX要稍微低些。 3…

Redis-哨兵模式-主机宕机-推选新主机的过程

文章目录 1、为哨兵模式准备配置文件2、启动哨兵3、主机6379宕机3.4、查看sentinel控制台日志3.5、查看6380主从信息 4、复活63794.1、再次查看sentinel控制台日志 1、为哨兵模式准备配置文件 [rootlocalhost redis]# ll 总用量 244 drwxr-xr-x. 2 root root 150 12月 6 2…

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分,是C语言的核心、精髓所在。用好指针,可以在C语言开发中起到事半功倍的效果。一方面,可以提高程序的编译效率、执行速度,以及动态存储分配;另一方面,可使程序更加…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Springboot开发Webservice服务端和客户端

环境说明 Java JDK 1.8、Spring boot 2.1.6、Apache CXF 3.1.6 POM依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.6</version&…

Facebook与地方文化:数字平台的多元表达

在当今数字化时代&#xff0c;社交媒体不仅仅是人们交流的工具&#xff0c;更是促进地方文化传播和表达的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook在连接世界各地用户的同时&#xff0c;也成为了地方文化多元表达的重要舞台。本文将深入探讨Facebook如何通过…

【MySQL】数据库——事务

一.事务概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行事务是一个不可分割的工作逻辑单元&#xff0c;在数…

【漏洞复现】脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大&#xff0c;运行稳定&#xff0c;操作简单方便&#xff0c;用户界面美观&#xff0c;轻松统计数据的一脸通系统。无需安装&#xff0c;只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备…

git clone自己的私有仓库

大家好&#xff0c;今天来教大家一个简单实用的操作——如何在自己的电脑上git clone自己的私有仓库。无论是工作还是学习&#xff0c;我们都可能会用到GitHub这样的代码托管平台来管理我们的项目&#xff0c;那么如何快速、安全地将这些项目下载到本地呢&#xff1f;下面就是详…

Web服务器与Apache(LAMP架构+搭建论坛)

一、Web基础 1.HTML概述 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语音,用于创建和组织Web页面的结构和内容&#xff0c;HTML是构建Web页面的基础&#xff0c;定义了页面的结构和内容&#xff0c;通过标记和元素来实现 2.HTML文件结构 <html>…

Zoho邮箱怎么注册?最强完整指南

Zoho企业邮箱&#xff0c;凭借其16年的产品历程和卓越的服务品质&#xff0c;已经成为全球超过1800万企业级客户的信赖之选。今天&#xff0c;我们将手把手教你如何注册Zoho邮箱。 一、Zoho邮箱是什么&#xff1f; Zoho邮箱是Zoho Workplace套件中的核心产品&#xff0c;专门…

Redis数据库的删除和安装

Redis数据库的删除和安装 1、删除Redis数据库2、下载Redis数据库 1、删除Redis数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过Redis数据库&#xff0c;要更换版本的话&#xff0c;其实Redis数据库的删除是比较简单的&#xff0c;打开我…