依赖倒转原则简述

1.高层模块不应该依赖低层模块,二者都应该依赖其抽象

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

3.依赖倒转得中心思想时面向接口编程

4.依赖倒转原则时基于这样得设计理念:相对于细节得多变性,抽象得东西要稳定得多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定得多。在java中,抽象指的时接口或是抽象类,细节就是具体得实现类

5.使用接口或抽象类的目的时规定好规范,而不涉及任何具体操作,把展现细节的任务交给他们的实现类完成

依赖倒转原则的三种实现方式

1.接口传递

2.构造方法传递

3.setter方式传递

应用实例

没有使用依赖倒转原则

  1. public class DependecyInversion {
  2. public static void main(String[] args) {
  3. Person p = new Person();
  4. p.receive(new Email());
  5. }
  6. }
  7. /*
  8. * 完成Person接收消息的功能
  9. *方式1分析
  10. *1. 简单,比较容易想到
  11. *2. 如果我们获取的对象是微信,短信等等,则新增类,同时Person类也要增加相应的接受方法
  12. *3.解决思路:引入一个抽象的接口IReceiver,表示接收者,这样Person类 与接口IReceiver发生依赖
  13. *因为Email,微信,等等属于接收的范围,他们各自实现IReceiver接口就ok了,这样我们就符合依赖倒转原则
  14. */
  15. class Email{
  16. public String getInfo() {
  17. return "电子邮件信息:hello, world";
  18. }
  19. }
  20. class Person{
  21. public void receive(Email email) {
  22. System.out.println(email.getInfo());
  23. }
  24. }

接口传递

  1. public class DependecyInversionTest {
  2. public static void main(String[] args) {
  3. //方法1,通过接口实现
  4. ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
  5. OpenAndClose openAndClose = new OpenAndClose(); //创建OpenAndClose类的对象
  6. openAndClose.open(changHong); //通过接口实现
  7. }
  8. }
  9. //方式1:通过接口传递依赖
  10. interface IOpenAndClose {
  11. public void open(ITV tv);
  12. }
  13. interface ITV {
  14. public void play();
  15. }
  16. class OpenAndClose implements IOpenAndClose{
  17. public void open(ITV tv) {
  18. tv.play();
  19. }
  20. }
  21. class ChangHong implements ITV{
  22. public void play() {
  23. System.out.println("打开");
  24. }
  25. }

构造方法传递

  1. public class DependecyInversionTest {
  2. public static void main(String[] args) {
  3. //方法2,通过构造器实现
  4. ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
  5. OpenAndClose openAndClose= new OpenAndClose(changHong); //创建OpenAndClose类的对象
  6. openAndClose.open(); //通过构造器实现
  7. }
  8. }
  9. //方式2,通过构造方法依赖传递
  10. interface IOpenAndClose {
  11. public void open();
  12. }
  13. interface ITV{
  14. public void play();
  15. }
  16. class OpenAndClose{
  17. public ITV tv;
  18. public OpenAndClose(ITV tv) {
  19. this.tv = tv;
  20. }
  21. public void open() {
  22. this.tv.play();
  23. }
  24. }
  25. class ChangHong implements ITV{
  26. @Override
  27. public void play() {
  28. // TODO Auto-generated method stub
  29. System.out.println("打开");
  30. }
  31. }

setter方式传递

  1. public class DependecyInversionTest {
  2. public static void main(String[] args) {
  3. //方法3,通过setter方式实现
  4. ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
  5. OpenAndClose openAndClose = new OpenAndClose(); //创建ChangHong类的对象
  6. openAndClose.setTV(changHong); //通过setter方式传递
  7. openAndClose.open(); //调用open()方法
  8. }
  9. }
  10. //方式3,通过setter方法传递
  11. interface IOpenAndClose{
  12. public void open();
  13. }
  14. interface ITV{
  15. public void play();
  16. }
  17. class ChangHong implements ITV{
  18. public ITV tv;
  19. public void play() {
  20. System.out.println("打开");
  21. }
  22. }
  23. class OpenAndClose implements IOpenAndClose{
  24. public ITV tv;
  25. public void setTV(ITV tv) {
  26. this.tv = tv;
  27. }
  28. public void open() {
  29. this.tv.play();
  30. }
  31. }

java设计模式学习笔记--依赖倒转原则的更多相关文章

  1. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  2. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  3. java设计模式学习笔记--开闭原则

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

  4. java设计模式学习笔记——里氏替换原则

    oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...

  5. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  6. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  7. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

随机推荐

  1. 1、OSI参考模型

    网络的层次模型:Core layer (核心层):高速转发,不建议做策略  Distribution layer (分布层,汇聚层):基于策略连接(路由控制,安全策略)Access layer (接入 ...

  2. 懒人必备,IntelliJ IDEA中代码一键生成

    之前有不少小伙伴问松哥微人事项目(https://github.com/lenve/vhr)使用的 MyBatis 逆向工程在哪里?其实旧版微人事当时没有使用逆向工程,是我自己手动敲出来的,当然手动敲 ...

  3. num13---外观模式/过程模式

    假设家庭影院有一系列设备,每个设备都有各种开闭等功能性方法,使用家庭影院功能的时候,需要进行各个设备的一系列操作,繁琐麻烦. 现在提供一个外观类,在里面定义操作流程,客户端只需要和外观类进行接口交互即 ...

  4. 什么是JWT以及具体应用

    jwt理论阮大神已经解释的很到位了 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html jwt官网收录了多种实现库, ...

  5. hive on spark 编译时遇到的问题

    1.官方网站下载spark 1.5.0的源码 2.根据官方编译即可. export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedC ...

  6. rsync命令 SCP命令

    快速查询scp:     scp  各种参数   源地址文件    目的地址文件   从本地复制到远程:        scp   [[user@]host1:]file1 ... [[user@]h ...

  7. 【重新整理】log4j 2的使用

    一 概述 1.1 日志框架 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log ...

  8. 【转载】linux操作系统与应用程序的main函数

    来源:https://blog.csdn.net/h542723151/article/details/52154871 这几天一直在纠结: main函数是程序的入口,一个程序启动后,经过bootlo ...

  9. 6.【Spring Cloud Alibaba】API网关-SpringCloudGateway

    SpringCloud Gateway是什么?优缺点分析 springCloud Gateway优点 springCloud Gateway缺点 编写SpringCloundGateway pom.x ...

  10. 前端的Cookies

    Cookies cookies 特性 前端数据存储 后端通过 HTTP 头设置 请求时通过 HTTP 头传给后端 前端可读可写 遵守同源策略 域名 有效期 路径 http-only secure(ht ...