一、什么是依赖倒转原则

依赖倒转(Dependence Inversion Principle ):

1.抽象不应该依赖于细节,细节应该依赖于抽象。

2.高层模块不依赖底层模块,两者都依赖抽象。

二、怎样做到依赖倒转

1.工厂方法模式

2.模板方法模式

3.迭代子模式

三、代码示例:

当系统想增加一个查询渠道,需要修改查询引擎,增加成员变量;如何做到依赖倒置??

package org.jason.designmode.DIP;public class AAPChannel {public void  query(){System.out.println("查询AAPChannel渠道资源");}
}package org.jason.designmode.DIP;public class IBEChannel {public void  query(){System.out.println("查询IBEChannel渠道资源");}
}/*
*   查询引擎
*
**/
package org.jason.designmode.DIP;public class FlightEngine {private IBEChannel  ibeChannel;private AAPChannel  aapChannel;public FlightEngine(){ibeChannel=new IBEChannel();aapChannel=new AAPChannel();}public void query(){ibeChannel.query();aapChannel.query();}}

代码改进:

package org.jason.designmode.DIP;import java.util.List;public class FlightEngine {private List<IFlightChannel> list;public FlightEngine(){list=FlightCommon.getChannel();}public void query(){if(list!=null&&list.size()>0){for(IFlightChannel  chanel:list){chanel.query();}}}public static void main(String[] args){FlightEngine  engine=new FlightEngine();engine.query();}}package org.jason.designmode.DIP;import java.util.*;public class FlightCommon {public  static  List<IFlightChannel> getChannel(){//根据配置获取支持的渠道列表String className = "";System.out.println("className="+className);//这一块的数据,后续可以通过查询配置表或者redis来加载,demo里面先简单写一下List<IFlightChannel> list=  new ArrayList<IFlightChannel>();IFlightChannel instance=null;try{className = String.format("org.jason.designmode.DIP.%sChannel",  "AAP");instance =(IFlightChannel) Class.forName(className).newInstance();list.add(instance);System.out.println(instance.getClass());className = String.format("org.jason.designmode.DIP.%sChannel",  "IBE");instance =(IFlightChannel) Class.forName(className).newInstance();System.out.println(instance.getClass());list.add(instance);}catch (Exception e){e.printStackTrace();}finally {return list;}}
}package org.jason.designmode.DIP;public interface IFlightChannel {public void query();}package org.jason.designmode.DIP;public class IBEChannel implements IFlightChannel {public void  query(){System.out.println("查询IBEChannel渠道资源");}
}package org.jason.designmode.DIP;public class AAPChannel implements IFlightChannel {public void  query(){System.out.println("查询AAPChannel渠道资源");}
}//优点:后续如果增加一个资源渠道,只需要新增一个XXXChannel的实现类,同时在资源渠道的配置表里增加一条渠道配置即可以。

软件架构设计原则-DIP依赖倒置原则相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【软件架构设计原则】开闭原则和依赖倒置原则

    文章目录 软件架构设计原则 开闭原则 依赖倒置原则 最后 软件架构设计原则 本文通过实例来讲解 开闭原则 依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软 ...

  8. 设计模式六大原则之--依赖倒置原则(DIP)

    1. 依赖倒置原则,(Dependence Inversion Principle, DIP ) 定义:High level modules should not depend upon low le ...

  9. 六大设计原则之依赖倒置原则07

    目录 1.概述 2.业务场景 3.运用设计原则前代码实现 3.1.代码实现 3.2.总结 4.运用设计原则后代码实现 4.1.代码实现 4.2.总结 1.概述 依赖倒置原则(Dependence In ...

最新文章

  1. 计算概论c和文科计算机,计算概论与计算机程序设计基础/C语言【理工学社】
  2. 服务器端发送邮件签名采用Data URI scheme包含图片
  3. Lower Power with CPF(三)
  4. (16)FPGA面试题MOORE 与 MEELEY状态机
  5. 如何解决cellIndex在IE下兼容性问题
  6. 关于selenium关闭chrome密码登录时弹出的密码提示框
  7. 2017-3-2 数据库索引/数据类型/引擎
  8. Linux实现黑客帝国背景炫酷效果
  9. 用Java实现MD5加盐
  10. c语言程序中延时函数作用,51单片机C语言延时函数怎么定义和使用 - 全文
  11. 矩阵的卷积以及使用python计算方法
  12. Oracle的nls_sort和nlssort()函数排序功能
  13. 我为什么觉得程序员是个高危职业
  14. 巨大数的运算 (前篇 ——对于整数) # 万进制 # —————— 开开开山怪
  15. (1)大数据和应用场景介绍
  16. Docker Registry部署镜像私有仓库及鉴权认证
  17. 51单片机wifi物联网的浇花控制系统设计
  18. 测试udp服务的端口是否可用
  19. 页面间大量数据参数传递
  20. 一个极简、高效的秒杀系统-战略设计篇

热门文章

  1. 关于电脑使用墨墨背单词使用键盘操作问题
  2. android 联通时间同步,NTP时间同步技术在中国联通信息化中的应用
  3. 【限时活动】99=苏宁会员+万达观影年卡
  4. PIC16F877A单片机 (ADC)
  5. Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录
  6. python气泡图画_Python使用Plotly绘图工具,绘制气泡图
  7. display, visibility, overflow 三者的作用与区别
  8. ❀数据集❀基于计算机视觉的情绪识别数据集
  9. 2021-02-09 sex没有被调用出来的原因 ,答案。 封装的sex
  10. 八张图,看懂数据分析如何驱动决策