1、基本介绍

  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 依赖倒转的中心思想是面向接口编程
  • 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类
  • 使用接口或抽象类的目的是制定好的规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

2、应用实例

编程完成Person接收消息的功能

2.1未遵循依赖倒转原则

以下方式:简单,比较容易想到

如果获取的对象是WetChat,短信等,则需要新增类,同时也要增加Person相对应的接收方法

package com.weirdo.principle.inversion;
public class inversion {public static void main(String[] args) {Person person = new Person();person.receive(new Email());}
}
class Email{public String getInfo(){return "邮件信息:hello world";}
}
class Person{public void receive(Email email){System.out.println(email.getInfo());}
}

2.2遵循依赖倒转原则

引入一个抽象的接口IReceiver,表示接收者,让Person类与接口IReceiver发生依赖

因为Email,WetChat等属于接收的范围,他们各自实现IReceiver接口就行了,如此便符合依赖倒转原则

package com.weirdo.segregation;public class Segregation1 {public static void main(String[] args) {A a = new A();a.depend1(new B());//A类通过接口去依赖B类a.depend2(new B());a.depend3(new B());C c = new C();c.depend1(new D());//C类通过接口去依赖D类c.depend4(new D());c.depend5(new D());}
}interface Interface1 {void operation1();
}
interface Interface2{void operation2();void operation3();
}
interface Interface3{void operation4();void operation5();
}class B implements Interface1,Interface2{@Overridepublic void operation1() {System.out.println("B 实现了 operation1");}@Overridepublic void operation2() {System.out.println("B 实现了 operation2");}@Overridepublic void operation3() {System.out.println("B 实现了 operation3");}
}class D implements Interface1,Interface3{@Overridepublic void operation1() {System.out.println("D 实现了 operation1");}@Overridepublic void operation4() {System.out.println("D 实现了 operation4");}@Overridepublic void operation5() {System.out.println("D 实现了 operation5");}
}/**
* 类A通过接口Interface1依赖(使用)B类,但是之会用到1,2,3方法
*/
class A{public void depend1(Interface1 i){i.operation1();}public void depend2(Interface2 i){i.operation2();}public void depend3(Interface2 i){i.operation3();}
}/**
* 类C通过接口Interface1依赖(使用)D类,但是之会用到1,4,5方法
*/
class C{public void depend1(Interface1 i){i.operation1();}public void depend4(Interface3 i){i.operation4();}public void depend5(Interface3 i){i.operation5();}
}

3、注意事项和细节

  • 底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
  • 变量的声明类型尽量是抽象类或接口,这样变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
  • 继承时遵循里斯替换原则

Java设计模式——依赖倒转原则(实例)相关推荐

  1. Java设计模式——依赖倒转原则

    一.什么是依赖倒转原则? 依赖倒转原则讲的是,要依赖于抽象,不要依赖于具体. 实现"开-闭"原则的关键是抽象化,并且从抽象化导出具体化实现."开-闭"原则是面向 ...

  2. Java设计模式 - 依赖倒转原则

    文章目录 1. 违反依赖倒转原则 2. 遵守依赖倒转原则 3. 依赖关系传递的3种方式 3.1 接口传递 3.2 构造方法传递 3.3 setter方法传递 4. 依赖倒转原则的注意事项和细节 Dep ...

  3. 23种设计模式-依赖倒转原则

    概念: 依赖倒转原则(Dependence Inversion Principle)是指: 1) 高层模块不应该依赖低层模块,二者都应该依赖其抽象 2) 抽象不应该依赖细节,细节应该依赖抽象 3) 依 ...

  4. [设计模式]依赖倒转原则

    代码如下: #include <iostream> #include <string>using namespace std;//银行工作人员 class BankWorker ...

  5. 设计模式--依赖倒转原则

    依赖倒转原则:依赖于抽象类(接口类),不依赖于具体实现类 即:高层业务逻辑依赖抽象类,具体实现类 依赖于抽象业务逻辑 高层逻辑为:软件设计具体需求(eg:制造一台电脑) 抽象层为:很多抽象类(eg:电 ...

  6. Java设计模式——开闭原则(实例)

    1.基本介绍 开闭原则是编程中最基础.最重要的设计原则 一个软件实体,如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框架,用实现扩展细节. 当软件需要变化时,尽量通过扩 ...

  7. Java设计模式——单一责任原则(实例)

    1.基本介绍 对类来说,即一个类应该只负责一项职责. 如类A负责两个不同职责:职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分为A1,A2 2.应用实例 2. ...

  8. 设计模式依赖倒转原则

  9. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

最新文章

  1. python计算向量夹角代码
  2. CentOS6.7 安装git
  3. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
  4. metadata model entry in /IWFND/CL_MED_MDL_SVC_GRP
  5. 453. 最小操作次数使数组元素相等
  6. android adb 进程端口号被占解决方法
  7. android遥控器:控制电脑上的暴风影音播放(C#作为服务端)
  8. 阿里云服务器搭建过程(小白起步)
  9. 【Opencv卸载与重装】NVIDIA Xavier NX下,卸载opencv3,重装opencv4
  10. TARA-汽车安全概念
  11. 运动蓝牙耳机选什么类型、蓝牙运动耳机推荐
  12. 字符流的相关概念和相关方法的使用、IO异常的处理以及Properties属性集
  13. 给ACCESS2003加密码和去掉密码
  14. 原生js小游戏——俄罗斯方块
  15. memset(G, 0x3f, sizeof(G))涵义
  16. 计算机网络原理 [第一章] 概述
  17. 华为的主动式电子笔M-Pen2
  18. 以获客为目标 ,如何从0到1实现用户增长?
  19. RC4加密算法在C++中的实现
  20. 西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院硕导介绍:王宇平...

热门文章

  1. linux 内存 thp,操作系统内存大页(THP)对redis性能的影响
  2. 【能效管理】关于某旅游度假中心项目水世界能源管理系统的设计与应用浅析
  3. UE4 如何做视屏清晰度(超清、高清、清晰、流畅)
  4. Blender 建模练习-锁链
  5. 中秋节,福利到,节日快乐
  6. java求三角形周长 面积_java求三角形面积以及周长---封装
  7. Google Earth Engine(gee)中的Image
  8. Java基础之序列化(类属性由驼峰转换成下划线)
  9. Unity开发经验小结--1.C#基础
  10. 使用多视角图卷积网络预测不规则区域的全市人群流量