依赖倒置原则定义

高层模块不应该依赖低层模块,二者都应该依赖其抽象。
程序要依赖于抽象接口,不要依赖于具体实现
  • 意思是应该面向接口编程,不应该面向细节编程。如果编写的程序是上层代码直接调用下层代码,当下层代码需要修改的时候,上层调用的代码也需要跟着变,会导致模块的复用性降低而且大大提高了开发的成本。如果建立抽象类,上层代码和下层代码都依赖抽象类,抽象类只要不变,细节再变化也不会影响调用代码。降低了耦合度,增加了程序的复用性。
我们以以下例子来说明:
直接调用下层代码例子如下:

先写一个靓仔类,定义靓仔在喂流浪猫流浪狗等信息,main方法直接调用靓仔类。这样有个弊端,就是靓仔类定义好的方法不能改变,或后期继续再添加喂其他小动物,一改变调用端就必须跟着改变代码,这种方法是很不灵活的。维护成本高复用性低。

public class LiangZai {public void feedCat(){System.out.println("此时屏幕前的靓仔在喂流浪猫");}public void feedDog(){System.out.println("此时屏幕前的靓仔在喂流浪狗");}
}
public class LiangZaiTest {public static void main(String[] args) {LiangZai liangZai = new LiangZai();liangZai.feedCat();liangZai.feedDog();}
}

所以这时候我们可以想到,设置一个抽象类,把固定的喂的动作先设定好,喂猫或者喂狗或者喂其他小动物再往里添加。所以我们以三种实现方法的例子分别实现

一、定义接口方式实现

先创建抽象类接口定义喂的动作,再创建具体动物类分别实现具体的行为

/*** 定义动物接口,定义公共的对动物行为的方法*/
public interface Animal {public void feed();}
//定义狗类,实现动物接口,完成对狗的行为细节
public class Dog implements Animal {@Overridepublic void feed() {System.out.println("此时屏幕前的靓仔在喂流浪狗");}
}
//定义猫类,实现动物接口,完成对狗的行为细节
public class Cat implements Animal {@Overridepublic void feed() {System.out.println("此时屏幕前的靓仔在喂流浪猫");}
}
//然后靓仔只用喂就行了,喂什么动物通过注入不同的动物控制
public class LiangZai {public void feed(Animal animal){animal.feed();}
}
//调用时候new什么动物,靓仔就能喂什么动物
public class LiangZaiTest {public static void main(String[] args) {LiangZai liangZai = new LiangZai();liangZai.feed(new Cat());liangZai.feed(new Dog());}
}

这样只要喂的这个行为的接口不变,喂什么都行,细节也可以随意变化。这种方式和Spring的依赖注入比较像,注入不同的动物,就能喂不同的动物。

二、通过构造方法方式实现

我们只用在第一种方法基础上修改靓仔类和靓仔调用main方法类,在靓仔类中通过构造方法传入动物类,想要喂什么动物就新建什么动物。但是这样做有一个问题,通过构造方法传入参数时,每次都需要重新创建一个对象,如果对象是单例对象,就不能new多个了

public class LiangZai {private Animal animal;//通过构造方法传入动物public LiangZai(Animal animal) {this.animal = animal;}public void feed(){animal.feed();}
}
public class LiangZaiTest {public static void main(String[] args) {//构造方法传入动物,需要每次喂动物都要来一个新的靓仔,但我们靓仔就一个怎么办LiangZai liangZai = new LiangZai(new Dog());liangZai.feed();LiangZai liangZai2 = new LiangZai(new Cat());liangZai2.feed();}
}
三、通过setter注入方法实现

其他方法不变,修改方法二中构造方法为setter方法,传入想要喂的动物喂就可以了

public class LiangZai {private Animal animal;//创建set方法,每次调用传入想喂的动物就行了public void setAnimal(Animal animal) {this.animal = animal;}public void feed(){animal.feed();}
}
public class LiangZaiTest {public static void main(String[] args) {LiangZai liangZai = new LiangZai();liangZai.setAnimal(new Dog());liangZai.feed();liangZai.setAnimal(new Cat());liangZai.feed();}
}

设计原则之依赖倒置原则详解相关推荐

  1. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  2. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  3. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

  4. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  5. 面向对象设计原则-03依赖倒置原则

    面向对象设计原则-03依赖倒置原则 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Rob ...

  6. php 倒置,PHP依赖倒置案例详解

    这次给大家带来PHP依赖倒置案例详解,PHP依赖倒置的注意事项有哪些,下面就是实战案例,一起来看一下. 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于 ...

  7. 3.六大原则例子-- 依赖倒置原则(DIP)例子

    设计模式六大原则例子-- 依赖倒置原则(DIP)例子 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对依赖倒置原则进行的举例说明. 依赖倒置原则的意义 DIP是6大原则中最难以实现的原则,它是实 ...

  8. 六大设计原则之依赖倒置原则07

    目录 1.概述 2.业务场景 3.运用设计原则前代码实现 3.1.代码实现 3.2.总结 4.运用设计原则后代码实现 4.1.代码实现 4.2.总结 1.概述 依赖倒置原则(Dependence In ...

  9. 面向对象七大设计原则之依赖倒置原则

    熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能.他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器. 本人菜鸟一枚本面文章的出发点是1.加深个人印象. ...

  10. 【软件架构设计原则】开闭原则和依赖倒置原则

    文章目录 软件架构设计原则 开闭原则 依赖倒置原则 最后 软件架构设计原则 本文通过实例来讲解 开闭原则 依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软 ...

最新文章

  1. 你的登录接口真的安全吗?快看看你有没有中招!
  2. 图像拼接--Automatic Panoramic Image Stitching using Invariant Features
  3. matlab的实用与仿真,MATLAB建模与仿真实用教程
  4. TeeChart.Direct2D.dll的使用
  5. OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题
  6. linux数组随机数,随机数与数组
  7. oracle 导入sql文件 汉字乱码_将现有的sql脚本导入 Oracle 数据库,中文乱码问题...
  8. php 两个类 相互调用_如何在 PHP 和 Laravel 中使用 Traits
  9. 「雕爷学编程」Arduino动手做(29)——DS1302时钟模块
  10. opencv+python 霍夫圆检测原理
  11. 2023-2029年中国LED产业园区行业市场深度监测及战略咨询研究报告
  12. oracle 授权所有语句,oracle grant 授权语句
  13. Flink实时数仓--ClickHouse数据可视化接口实现、Sugar 数据大屏
  14. 祝你永远理性,永远能不识时务的抖机灵
  15. html 表格横向排列,excel表格数据如何实现横向排列-Excel表格怎样把多列横向数据按照顺序改为纵向排列......
  16. JavaWeb——EL 函数
  17. 企业如何CRM管理软件中受益
  18. 算法学习-素数与合数小结
  19. 微信电脑版无法获取二维码
  20. 为什么冠状病毒从湖北出发传播这么快?

热门文章

  1. 硬件编程语言和编程器件
  2. 关于magic-api的使用入门
  3. CSR蓝牙芯片进测试模式方法
  4. Android netd 简单分析和配置iptable
  5. html5页面左右框架布局代码,网页布局框架(示例代码)
  6. Echarts图表移动端手机横屏展示
  7. 基于EEG信号的文献记录01(0719)-特征选择和分类算法在基于脑电信号的睡眠阶段分类中的比较研究
  8. iOS开发值苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
  9. HOG特征,LBP特征,Haar特征(图像特征提取)
  10. 影视剪辑,12天自学视频剪辑入门规划