依赖倒置原则

news/2024/9/18 3:55:15/文章来源:https://www.cnblogs.com/ZWJ7671277/p/18368655

一、前言
依赖倒置原则也称依赖倒转原则(Dependence Inversion Principle)
看官方定义
高层模块不应该依赖底层模块,二者都应该依赖其抽象

抽象不应该依赖细节,细节应该依赖抽象

依赖倒置的中心思想是面向接口编程

如果你了解点设计模式,应该理解上面的话,但是如果不了解的话,感觉说的云里雾里的,是不是一脸懵,懵这就对了,那就先看例子吧,会帮助你理解的!

二、举例说明

例子介绍(无聊的可看看,着急的请跳过)
能看下面的类图就看图,能看代码就看代码,我就是简单说一下例子的想法
如果你问身边的人或者看网上的代码都不是自己的思想,如果你没有勇气把公司的代码都用设计模式优化一遍,那就忍着,等你的架构师忍不住的时候再动手,但是如果学完东西不实操很容易就忘记。
那这就需要好的例子了,其实举例也是思想得一部分,懂得多了,就信手拈来,公司中好多人都会跟你说只可意会不可言传,我挺讨厌这句话的,说了等于没说,如果你不想继续当码农,不妨把生活应用于实践,别人问你什么你能用通俗易懂的例子告诉他,你就赢了!
因为我养着一条狗叫麦兜,心里又喜欢着猫,想在多年后一定要养一只布偶或者德文,所以我的很多例子都是很麦兜有关系,设计来源于生活!那下面的例子就是家庭养殖场养殖各种宠物的例子

1)类图说明
  • 直接上图:

在这里插入图片描述

  • 图说明了一切,以后再有新增动物,FamilyFarm 还会继续跟你合作,因为你让他省事到只写一次就为一生,太方便了!
package com.liu.susu.principle.inversion.example3;/*** @FileName FamilyFarm* @Description 使用 依赖倒置原则 优化后的代码* @Author susu* @date 2022-02-13**/
public class FamilyFarm {public void raisePet(petGrowthProcess petGrowthProcess){petGrowthProcess.petBorn();petGrowthProcess.petGrowUp();petGrowthProcess.petBeRaised();}}
interface petGrowthProcess{void petBorn();void petGrowUp();void petBeRaised();
}
class DogGrowthProcess implements petGrowthProcess{public void petBorn(){System.out.println("狗狗-->麦兜出生了……");}public void petGrowUp(){System.out.println("狗狗-->麦兜长大了……");}public void petBeRaised(){System.out.println("狗狗-->麦兜被饲养员带走了……");}
}class CatGrowthProcess implements petGrowthProcess{public void petBorn(){System.out.println("小猫-->阿苔出生了……");}public void petGrowUp(){System.out.println("小猫-->阿苔长大了……");}public void petBeRaised(){System.out.println("小猫-->阿苔被饲养员带走了……");}
}class ClientTest{public static void main(String[] args) {FamilyFarm familyFarm = new FamilyFarm();//饲养狗狗familyFarm.raisePet(new DogGrowthProcess());//饲养小猫familyFarm.raisePet(new CatGrowthProcess());}
}
package com.liu.susu.principle.inversion.example4;/*** @FileName FamilyFarm* @Description 使用 依赖倒置原则 优化后的代码* @Author susu* @date 2022-02-13**/
public class FamilyFarm {public void raisePet(petGrowthProcess petGrowthProcess){petGrowthProcess.petBorn();petGrowthProcess.petGrowUp();petGrowthProcess.petBeRaised();}}interface petGrowthProcess{void petBorn();void petGrowUp();void petBeRaised();
}class DogGrowthProcess implements petGrowthProcess{public void petBorn(){System.out.println("狗狗-->麦兜出生了……");}public void petGrowUp(){System.out.println("狗狗-->麦兜长大了……");}public void petBeRaised(){System.out.println("狗狗-->麦兜被饲养员带走了……");}
}class CatGrowthProcess implements petGrowthProcess{public void petBorn(){System.out.println("小猫-->阿苔出生了……");}public void petGrowUp(){System.out.println("小猫-->阿苔长大了……");}public void petBeRaised(){System.out.println("小猫-->阿苔被饲养员带走了……");}
}//新增功能饲养羊
class sheepGrowthProcess implements petGrowthProcess{public void petBorn(){System.out.println("小羊-->点点出生了……");}public void petGrowUp(){System.out.println("小羊-->点点长大了……");}public void petBeRaised(){System.out.println("小羊-->点点被饲养员带走了……");}
}class ClientTest{public static void main(String[] args) {FamilyFarm familyFarm = new FamilyFarm();//饲养狗狗familyFarm.raisePet(new DogGrowthProcess());//饲养小猫familyFarm.raisePet(new CatGrowthProcess());//新增功能饲养羊familyFarm.raisePet(new sheepGrowthProcess());}
}
package com.liu.susu.principle.inversion.example5;/*** @FileName FamilyFarm* @Description 使用 依赖倒置原则 优化后的代码* @Author susu* @date 2022-02-13**/
public class FamilyFarm {public void raisePet(petGrowthProcess petGrowthProcess){petGrowthProcess.petBorn();petGrowthProcess.petGrowUp();petGrowthProcess.petBeRaised();}}abstract class petGrowthProcess{public abstract void petBorn();public abstract void petGrowUp();public abstract void petBeRaised();
}class DogGrowthProcess extends petGrowthProcess{public void petBorn(){System.out.println("狗狗-->麦兜出生了……");}public void petGrowUp(){System.out.println("狗狗-->麦兜长大了……");}public void petBeRaised(){System.out.println("狗狗-->麦兜被饲养员带走了……");}
}class CatGrowthProcess extends petGrowthProcess{public void petBorn(){System.out.println("小猫-->阿苔出生了……");}public void petGrowUp(){System.out.println("小猫-->阿苔长大了……");}public void petBeRaised(){System.out.println("小猫-->阿苔被饲养员带走了……");}
}//新增功能饲养羊
class sheepGrowthProcess extends petGrowthProcess{public void petBorn(){System.out.println("小羊-->点点出生了……");}public void petGrowUp(){System.out.println("小羊-->点点长大了……");}public void petBeRaised(){System.out.println("小羊-->点点被饲养员带走了……");}
}class ClientTest{public static void main(String[] args) {FamilyFarm familyFarm = new FamilyFarm();//饲养狗狗familyFarm.raisePet(new DogGrowthProcess());//饲养小猫familyFarm.raisePet(new CatGrowthProcess());//新增功能饲养羊familyFarm.raisePet(new sheepGrowthProcess());}
}

三、总结

3.1 倒置?为什么叫倒置?
看完上面案例,现在明白了吗?
反例:家庭农场依赖狗狗猫猫的成长过程的细节
正例:狗狗猫猫羊羊都继承了 petGrowthProcess 接口(即:让细节依赖抽象),家庭农场 依赖抽象,不再依赖细节;这不就倒回来了嘛
3.3 再琢磨一下官方概念
琢磨概念之前先简单说一下Java基础:
在Java中,抽象指的是接口或者抽象类,而具体的实现类指的是细节。
依赖倒置基于细节应该依赖抽象等设计理念,相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的框架要稳定的多
使用接口或抽象类的目的是指定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现去完成。
即:依赖倒置的思想就是面向接口编程思想
3.4 作用
可以降低类间的耦合性。
可以提高系统的稳定性。
可以减少并行开发引起的风险。
可以提高代码的可读性和可维护性。
3.5 使用原则
底层模块,尽量都要有抽象类或者接口,或者两者都具备,这样程序的稳定性会更好;
变量的声明类型尽量是接口或者是抽象类。
使用继承时尽量遵循里氏替换原则。

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

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

相关文章

常见温升测试方法

常见温升测试方法 温升测试是电器产品安规测试项目之一,是为了检测电器产品及部件的温度变化情况,判断是否符合要求。在设备运行过程中会释放一定的热量,如果内部温度过高会影响产品的性能和稳定性,导致绝缘性能下降,因此温升测试是确保产品稳定运行的重要步骤。那么如何进…

当代码遇上诈骗,开发者该何去何从?

大家好,我是晓凡。 不知道大家最近有没有刷到这样一则消息:知名开源工具 Aria 的开发者删库跑路。 是的,你没听错,这不是段子,这是真事儿! 一言不合就删库? 这事儿得从一条令人震惊的提交记录说起。开发者留下的话,简直比冬天的北风还要刺骨:“因为自己的开源项目被诈…

5 个有趣的 Python 开源项目「GitHub 热点速览」

本期,我从上周的开源热搜项目中精心挑选了 5 个有趣、好玩的 Python 开源项目。 首先是 PyScript,它可以让你直接在浏览器中运行 Python 代码,不仅支持在 HTML 中嵌入,还能安装第三方库。然后是用 Python 写的“魔法虫洞” magic-wormhole,这是一个无需服务器、通过一条命…

耗时9个月,1.34万行代码,这套分布式微服务架构项目,完结啦!

作者:小傅哥 博客:https://bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!😄大家好,我是技术UP主小傅哥。 耗时9个月,1.34万行代码,55节课程,全程视频手把手。这套微服务、分布式、DDD架构,涵盖了;抽奖、活动、积分、兑换,运用了分库分表、binlog同步数据…

JetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDEJetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-phpstorm/,查看最新版。原创作品,转载请…

Viper:强大的Go配置解析库

1 介绍 Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。目前Star 26.6k, 它支持以下特性:设置默认值 从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息 实时监控和重新读取配…

JetBrains GoLand 2024.2 (macOS, Linux, Windows) - 为 Go 开发者打造的完整 IDE

JetBrains GoLand 2024.2 (macOS, Linux, Windows) - 为 Go 开发者打造的完整 IDEJetBrains GoLand 2024.2 (macOS, Linux, Windows) - 为 Go 开发者打造的完整 IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-goland/,查看最新版。原创作…

流媒体服务器如何让WebRTC支持H.265,同时又能支持Web Chrome硬解码、软解码:DataChannel+MSE+WASM解码H.265

为了这一整套的解决方案,调研+研发整整花费了差不多半年多的时间,需达成的目标:流媒体服务器端不需要将H.265转码成H.264,就能让Chrome解码播放H.265;注意:现在很多市面上的软硬件通过转码H.265成H.264的方式来支持WebRTC,个人理解,这既费硬件又是技术的倒退!Web JS解…

Avalonia 后台代码简单播放动画示例

本文将演示如何在 Avalonia 的后台代码里面创建 Animation 执行播放本文演示的内容是将界面里面的一个 TextBlock 控件,通过修改控件的 RenderTransform 的 TranslateTransform 执行平移 为了方便演示,先在 MainView.axaml 里面添加一个 TextBlock 控件,如下面代码。大家可以…

读软件开发安全之道:概念、设计与实施03威胁

读软件开发安全之道:概念、设计与实施03威胁1. 威胁 1.1. 威胁常常比事件本身更加可怖1.1.1. 索尔阿林斯基1.2. 威胁无处不在1.2.1. 如果妥善管理,我们也可以安然与威胁共存1.2.2. 我们自己没有几百万年进化而来的本能来防御软件方面的威胁1.3. 把视角从软件构建者转向攻击者…

ubuntu18.04安装dns服务器

1. 安装dnsmasqsudo apt install dnsmasq 2. 在配置文件/etc/dnsmasq.conf末尾添加自定义域名 3. 测试配置文件sudo dnsmasq --test 4. 开启dns服务sudo systemctl restart dnsmasq

CloudFlare Workers 日志管理方案全解析

CloudFlare Workers, Logpush, Tail Workers, Real-time Logging, 实时日志服务, 低成本目录引言 Logpush介绍 推送目标 操作步骤Tail Workers介绍 操作步骤实时日志介绍 使用方法 局限性替代方案:手动发送日志实现方式 注意事项方案选择推荐方案:手动发送日志到Sentry总结在…