依赖倒转原则简述

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. show processlist详解

    摘自:https://blog.csdn.net/sunqingzhong44/article/details/70570728?utm_source=copy 如果您有root权限,您可以看到所有线 ...

  2. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  3. 云原生 - Istio可观察性之监控(四)

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  4. 脚本实现统计osd内的pg数量

    脚本代码如下: ceph pg dump | awk ' /pg_stat/ { col=; while($col!=“up”) {col++}; col++ } /[-9a-f]+.[-9a-f]+ ...

  5. Sqlite命令行基本操作

    SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中. 与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中. 1.进入命 ...

  6. FMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  7. [redis读书笔记] 第二部分 集群

    1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手 ...

  8. 20191223-python学习第三天

    1.运算符补充 (1)in 与 not  in 学习 (2)优先级 >小于 ,<小于,计算运算关系优先级 > not > and > or 2.charm自动生成文件头部 ...

  9. Linux bash管道符“|”使用介绍与例子

    https://blog.csdn.net/wangqianyilynn/article/details/75576815

  10. 数据库主从监控脚本,数据传到influxdb

    #!/bin/bash port=`/usr/sbin/ss -ntlp | | awk '{print $4}' | awk -F":" '{print $2}'` array= ...