软件架构设计原则-DIP依赖倒置原则
一、什么是依赖倒转原则
依赖倒转(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依赖倒置原则相关推荐
- 7.12 其他面向对象设计原则3: 依赖倒置原则DIP
其他面向对象设计原则3: 依赖倒置原则DIP The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...
- 软件设计原则之里氏替换原则、依赖倒置原则
系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...
- 面向对象设计原则-03依赖倒置原则
面向对象设计原则-03依赖倒置原则 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Rob ...
- 3.六大原则例子-- 依赖倒置原则(DIP)例子
设计模式六大原则例子-- 依赖倒置原则(DIP)例子 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对依赖倒置原则进行的举例说明. 依赖倒置原则的意义 DIP是6大原则中最难以实现的原则,它是实 ...
- 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则
目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...
- 设计模式六大原则之里氏替换原则、依赖倒置原则详解
设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...
- 【软件架构设计原则】开闭原则和依赖倒置原则
文章目录 软件架构设计原则 开闭原则 依赖倒置原则 最后 软件架构设计原则 本文通过实例来讲解 开闭原则 依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软 ...
- 设计模式六大原则之--依赖倒置原则(DIP)
1. 依赖倒置原则,(Dependence Inversion Principle, DIP ) 定义:High level modules should not depend upon low le ...
- 六大设计原则之依赖倒置原则07
目录 1.概述 2.业务场景 3.运用设计原则前代码实现 3.1.代码实现 3.2.总结 4.运用设计原则后代码实现 4.1.代码实现 4.2.总结 1.概述 依赖倒置原则(Dependence In ...
最新文章
- 计算概论c和文科计算机,计算概论与计算机程序设计基础/C语言【理工学社】
- 服务器端发送邮件签名采用Data URI scheme包含图片
- Lower Power with CPF(三)
- (16)FPGA面试题MOORE 与 MEELEY状态机
- 如何解决cellIndex在IE下兼容性问题
- 关于selenium关闭chrome密码登录时弹出的密码提示框
- 2017-3-2 数据库索引/数据类型/引擎
- Linux实现黑客帝国背景炫酷效果
- 用Java实现MD5加盐
- c语言程序中延时函数作用,51单片机C语言延时函数怎么定义和使用 - 全文
- 矩阵的卷积以及使用python计算方法
- Oracle的nls_sort和nlssort()函数排序功能
- 我为什么觉得程序员是个高危职业
- 巨大数的运算 (前篇 ——对于整数) # 万进制 # —————— 开开开山怪
- (1)大数据和应用场景介绍
- Docker Registry部署镜像私有仓库及鉴权认证
- 51单片机wifi物联网的浇花控制系统设计
- 测试udp服务的端口是否可用
- 页面间大量数据参数传递
- 一个极简、高效的秒杀系统-战略设计篇
热门文章
- 关于电脑使用墨墨背单词使用键盘操作问题
- android 联通时间同步,NTP时间同步技术在中国联通信息化中的应用
- 【限时活动】99=苏宁会员+万达观影年卡
- PIC16F877A单片机 (ADC)
- Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录
- python气泡图画_Python使用Plotly绘图工具,绘制气泡图
- display, visibility, overflow 三者的作用与区别
- ❀数据集❀基于计算机视觉的情绪识别数据集
- 2021-02-09 sex没有被调用出来的原因 ,答案。 封装的sex
- 八张图,看懂数据分析如何驱动决策