依赖倒置原则(简称DIP),的本质骑士就是通过抽象(抽象类或接口)使各个类或模块的实现彼此独立,不相互影响,实现模块间的松耦合。但是这个原则也是6个设计原则中最难以实现的了,如果没有实现这个原则,那么也就意味着开闭原则(对扩展开发,对修改关闭)也无法实现。即

1、高层模块不应该依赖低层模块,两者都应该依赖于抽象(抽象类或接口)

2、抽象(抽象类或接口)不应该依赖于细节(具体实现类)

3、细节(具体实现类)应该依赖抽象

抽象:即抽象类或接口,两者是不能够实例化的。

细节:即具体的实现类,实现接口或者继承抽象类所产生的类,两者可以通过关键字new直接被实例化。

而依赖倒置原则的本质骑士就是通过抽象(抽象类或接口)使各个类或模块的实现彼此独立,不相互影响,实现模块间的松耦合。但是这个原则也是6个设计原则中最难以实现的了,如果没有实现这个原则,那么也就意味着开闭原则(对扩展开发,对修改关闭)也无法实现。

依赖倒置有三种方式来实现

1、通过构造函数传递依赖对象

比如在构造函数中的需要传递的参数是抽象类或接口的方式实现。

2、通过setter方法传递依赖对象

即在我们设置的setXXX方法中的参数为抽象类或接口,来实现传递依赖对象

3、接口声明实现依赖对象
public class Tutu {
//JIM是个女孩,会煮面
public void cook(Noodles noodles)
{
noodles.eat();
}
}
面条(目前只会煮面)

public class Noodles {
//吃面条
public void eat()
{
System.out.println("JIM吃面条...");
}
}
涂涂坐在家里吃面(场景类)

public class Home {
public static void main(String args[])
{
Tutu tutu = new Tutu();
Noodles food = new Noodles();
tutu.cook(food);
}
}
运行结果:JIM吃面条...

但是这有个问题,涂涂只会做面条,不可能每次都吃面条吧,天天吃面吃死你,所以在上面的Tutu类中的cook方法中,如果涂涂会做其他吃的,那岂不是更好。于是她向家庭主妇迈进了一步,使用了依赖倒置原则。

也就是JIM通过学习还可以焖米饭,炒鱿鱼(虽然听着不爽,但是很好吃),京酱肉丝啊等等。要想在代码中实现,就需要实现两个接口:ITutu和IFood

public interface ITutu {
//这样就会做很多饭菜了
public void cook(IFood food);
}
实现类
public class Tutu implements ITutu {
@Override
public void cook(IFood food) {
food.eat();
}
}
食物接口

public interface IFood {
public void eat();
}
这样就为扩展留出了很大的空间,方面扩展其他的类。也不会对细节有变动。以后涂涂想吃什么学一下就可以自己做了
实现面条

public class Noodles implements IFood {
@Override
public void eat() {
System.out.println("涂涂吃面条...");
}
}
实现米饭

public class Rice implements IFood {
@Override
public void eat() {
System.out.println("涂涂吃米饭(终于吃上米饭了)...");
}
}
场景类:JIM在家里开吃了,想吃什么直接做就是了

public class Home {
public static void main(String args[])
{
//接口使不能实例化滴
ITutu tutu = new Tutu();
//实例化米饭,涂涂可以吃米饭了
IFood rice = new Rice();
//吃面条
//IFood noodles = new Noodles();
tutu.cook(rice);
}
}
这样各个类或模块的实现彼此独立,不互相影响,实现了。

设计模式原则之六:依赖倒置原则相关推荐

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

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

  2. 依赖倒置原则——举例说明Java设计模式中的依赖倒置原则

    依赖倒置原则--举例说明Java设计模式中的依赖倒置原则 一.前言 看官方定义 二.举例说明 2.1 例子介绍(无聊的可看看,着急的请跳过) 2.2 反例 2.1.1 反例1 (1)类图说明 (2)代 ...

  3. 设计模式系列:依赖倒置原则

    问题由来   问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修 ...

  4. Java设计模式6,依赖倒置原则

    目录 一.依赖倒置原则定义 二.违背原则方案 1.项目经理 2.获取平均项目进度 3.获取最慢项目进度 三.依赖倒置原则改善代码 1.获取项目进度接口 2.获取平均项目进度实现类 3.获取最慢项目进度 ...

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

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

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

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

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

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

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

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

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

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

  10. 设计模式原则之依赖倒置原则

    所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体.简单的说就是对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合. ...

最新文章

  1. UltraIso-写入硬盘映像
  2. GNSS系列--GNSS坐标系转换
  3. tcm可信密码模块linux,基于可信密码模块的可信电子签名终端设计与实现
  4. 如何查看oracle版本信息,如何查看oracle版本信息
  5. SYSCALL_DEFINE含义
  6. Android集成三方浏览器之Crosswalk
  7. redis学习与入门~~~
  8. 【C语言】C语言中一些零碎的基础知识
  9. 表单中Readonly和Disabled的区别
  10. 一次性杯子机器人挂件手工制作_变废为宝 ———环保笔筒制作
  11. Android学习笔记之图像颜色处理(ColorMatrix)
  12. 解决Git 重复输入用户名和密码的问题
  13. 红外遥控器-VS1838B/HS0038红外接收方案(包含原理图+PCB+BOM表+程序)
  14. 【Pygame小游戏】超好玩的——Python版“愤怒的小鸟”,我能玩上一整天(附源码)
  15. [机器学习] 信用评分卡中的应用 | 干货
  16. Js push整个数组
  17. Ajax请求的五大步骤——一看就会
  18. APP被苹果App Store拒绝的79个原因(未完待续)
  19. 开源中国(OSChina)源码解析(2)——闪屏页
  20. 图扑软件数字孪生海上风电 | 向海图强,奋楫争先

热门文章

  1. 鸿蒙系统全是外国技术,华为正式发布鸿蒙操作系统!四大技术特性亮眼
  2. mongodb模糊查询_我叫Mongo,收了「查询基础篇」,值得你拥有
  3. 接口测试——Fiddler使用要点——笔记整理
  4. spring 全局变量_Spring 十个错误的使用姿势!
  5. 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
  6. android html 换行_android TextView怎么设置个别字体颜色并换行?
  7. 软件测试:做一些简单工作经历总结,自己想到那算那吧
  8. mysql 订单id格式_【mysql】订单规则id怎么生成?
  9. python编辑excel文件_python自动化之修改excel(包括xls文件和xlsx文件)
  10. matlab字体设置