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. POJ3080方法很多(暴力,KMP,后缀数组,DP)
  2. VPS批量管理软件--远程桌面批量管理
  3. python进阶 多线程编程 —— threading和queue库实现多线程编程
  4. spring Aop实现身份验证和springboot异常统一处理
  5. 【Spring实战4】04---装配Bean(自动装配)
  6. larvare数据库引入php_PHP全栈学习笔记6
  7. ajax里怎么添加跳转地址,Ajax中window.location.href无法跳转的解决办法
  8. liunx中udp服务器与客户端创建
  9. mysql begin operations_MySQL入门(七):More JOIN operations
  10. oracle获取SID
  11. 安装Sql server 2008遇到无法安装.net 3.5的问题解决办法
  12. Banner字符可以通过类似以下网站生成
  13. python-excel 批量新建excel工作表
  14. 日本初创公司Elix正在使用AI研究COVID-19药物
  15. Apple ID更换绑定的受信任电话号码教程
  16. MacBook 版 IDEA- 2022.2 新版本UI插件
  17. 360锁屏壁纸在哪个文件夹
  18. Java零基础P20使用IDEA开发
  19. HP笔记本HDMI检测不到外接显示器
  20. val和var的区别

热门文章

  1. css基础-3-文本样式
  2. kali破解wifi
  3. 数据库整理+SQL笔试2道
  4. 配置本地连接/使用AKS集群
  5. 代码分享:宠物小精灵开场特效
  6. HDU - 1408 盐水的故事
  7. 错换人生,郭威在法律上对生父母和养父母的赡养义务分别是怎样?
  8. DeFi借贷VS传统金融“无风险”利率产品
  9. 云栖干货回顾 |“顶级玩家”集结!分布式数据库专场精华解读
  10. latex数学公式,希腊字母,字体总结