连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则
DIP,dependency inversion principle,中文翻译为“依赖倒置原则”。
DIP是大名鼎鼎的Martin大师提出来的。他在1996 5月的C++ Reporter发表“ The Dependency Inversion Principle”的文章具体阐述了DIP原则,而且在他的经典著作《 Agile Software Development, Principles, Patterns》(中文翻译为:敏捷软件开发:原则、模式与实践)、《Practices, and Agile Principles, Patterns, and Practices in C#》(中文翻译为:敏捷软件开发:原则、模式与实践(C#版))中详解了DIP原则。
DIP原则主要有两点含义:
1) 高层模块不应该直接依赖低层模块。两者都应该依赖抽象层。
2) 抽象不能依赖细节。细节必须依赖抽象。
尽管DIP原则的解释很清楚。但要真正理解也不那么简单,由于有几个关键的术语都比較抽象,我们须要更具体的解析:
1)什么是模块?
英文中用到了module、component,但我们这是在讲类的设计原则,为什么要把DIP拉进来呢?
事实上Martin大师仅仅是讲一个设计原则而已,这个原则能够应用到软件系统不同的层级。
比如:站在架构层的角度,模块能够指子系统subsystem
站在子系统的角度。模块能够指module,component
站在模块的角度:模块能够指类
所以说。这里的模块应该是一个广义的概念,而不是狭义的软件系统里各个子模块。
2)什么是依赖?
这里的依赖相应到具体的面向对象领域事实上包括几个内容:
高层模块“依赖”低层模块:指高层模块须要调用低层模块的方法。
高层模块依赖抽象层:指高层模块基于抽象层编程;
低层模块依赖抽象层:指低层模块继承(inheritance)或者实现(implementation)抽象层。
细节依赖抽象:事实上和上一个依赖是同一个意思;
所以说,大师就是大师啊,一个简简单单的“依赖”将各种情况都概括进来了,仅仅是苦了我们这些平庸人,要么导致无法理解,要么导致理解错误:(
我们以一个简单例子来详解这些依赖,例子包括一个Player类,代表玩家。ICar接口。代表汽车;Benz、Ford、Chery代表具体的汽车,具体的代码例如以下
【Player】
package com.oo.oop.dip; /**
* 玩家,相应DIP中的“高层模块”
*
*/
public class Player { /**
* 开福特
* 不好的依赖:相应DIP中的“高层模块依赖低层模块”,Player直接使用了Ford类对象作为參数,Ford类改动,Player类【须要】又一次编译測试
*/
public void play(Ford car)
{
car.accelerate();
car.shift();
car.steer();
car.brake();
} /**
* 开奔驰
* 不好的依赖:相应DIP中的“高层模块依赖低层模块”。Player直接使用了Benz类对象作为參数。Benz类改动,Player类【须要】又一次编译測试
*/
public void play(Benz car)
{
car.accelerate();
car.shift();
car.steer();
car.brake();
} /**
* 开奇瑞
* 不好的依赖:相应DIP中的“高层模块依赖低层模块”,Player直接使用了Chery类对象作为參数,Chery类改动。Player类【须要】又一次编译測试
*/
public void play(Chery car)
{
car.accelerate();
car.shift();
car.steer();
car.brake();
} /**
* 开车
* 好的依赖: 相应DIP中的“高层模块依赖抽象层”,Player依赖ICar接口。不须要知道具体的车类型。Ford、Benz、Chery类改动。Player类【不须要】又一次编译測试。仅仅有ICar改动的时候Player才须要改动
*/
public void play(ICar car)
{
car.accelerate();
car.shift();
car.steer();
car.brake();
} }
【ICar】
package com.oo.oop.dip; /**
* 汽车接口,相应DIP中的抽象层
*/
public interface ICar { /**
* 加速
*/
public void accelerate(); /**
* 换挡
*/
public void shift(); /**
* 转向
*/
public void steer(); /**
* 刹车
*/
public void brake();
}
【Benz】
package com.oo.oop.dip; /**
* 奔驰,实现了ICar接口,相应DIP中的“低层依赖抽象层”
*
*/
public class Benz implements ICar { @Override
public void accelerate() { //加速很快
System.out.println("Benz accelerate: very fast !!");
} @Override
public void shift() { //自己主动挡
System.out.println("Benz shift: automatic transmission !!");
} @Override
public void steer() { //很平稳
System.out.println("Benz steer: very smooth,ESP && DSC && VSC !!");
} @Override
public void brake() { //刹车辅助系统
System.out.println("Benz steer: ABS && EBA && BAS && BA !!");
} }
【Ford】
package com.oo.oop.dip; /**
* 福特,实现了ICar接口,相应DIP中的“低层依赖抽象层”
*
*/
public class Ford implements ICar { @Override
public void accelerate() { //加速快
System.out.println("Ford accelerate: fast !!");
} @Override
public void shift() { //手自一体变速器
System.out.println("Ford shift: Tiptronic transmission !!");
} @Override
public void steer() { //平稳
System.out.println("Ford steer: smooth。ESP !!");
} @Override
public void brake() { //刹车辅助系统
System.out.println("Ford steer: ABS && EBA &!!");
} }
【Chery】
package com.oo.oop.dip; /**
* 奇瑞。实现了ICar接口,相应DIP中的“低层依赖抽象层”
*
*/
public class Chery implements ICar { @Override
public void accelerate() { //加速慢
System.out.println("Chery accelerate: slow !!");
} @Override
public void shift() { //手动挡
System.out.println("Chery shift: manual transmission !!");
} @Override
public void steer() { //平稳
System.out.println("Chery steer: smooth。ESP && DSC !!");
} @Override
public void brake() { //刹车辅助系统
System.out.println("Chery steer: only ABS !!");
} }
================================================
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/30749311
================================================
连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则的更多相关文章
- 连载:面向对象葵花宝典:思想、技巧与实践(28) - 设计原则:内聚&耦合
前面通过实例解说了一个一环扣一环的面向对象的开发流程:用例模型 -> 领域模型 -> 设计模型(类模型 + 动态模型),解答了面向对象怎样做的问题.接下来我们就要讲"怎样做好面向 ...
- 连载:面向对象葵花宝典:思想、技巧与实践(33) - ISP原则
ISP,Interface Segregation Principle,中文翻译为"接口隔离原则". 和DIP原则一样,ISP原则也是大名鼎鼎的Martin大师提出来的,他在19 ...
- IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★
IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...
- 黑马程序员——OC语言基础语法 面向对象的思想
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...
- Java面向对象的思想
面向对象的思想 1.面向对象的思想的特点: ①符合人们的日常思考习惯 ②能将复杂的问题简单化 ③将原来的执行者变为了现在的指挥者 面向对象的思想,所谓的对象,其实就是实体.对于实物的描述,通常有两个方 ...
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- U3D 飞机大战(MVC模式)解析--面向对象编程思想
在自己研究U3D游戏的时候,看过一些人的简单的游戏开发视频,写的不错,只是个人是java web 开发的人,所以结合着MVC思想,对游戏开发进行了一番考虑. 如果能把游戏更加的思想化,分工化,开发便明 ...
- OC - 1.面向过程和面向对象的思想对比
一.面向过程 1> 思想 面向过程是一种以过程为中心的最基础编程思想,不支持面向对象的特性. 面向过程是一种模块化程序设计方法 2> 开发方法 面向过程的开发方法是以过程(也可以说是模块) ...
- .net的自定义JS控件,运用了 面向对象的思想 封装 了 控件(.net自定义控件开发的第一天)
大家好!我叫刘晶,很高兴你能看到我分享的文章!希望能对你有帮助! 首先我们来看下几个例子 ,就能看到 如何 自定义控件! 业务需求: 制作 一个 属于 自己的 按钮 对象 ,然后 像 ...
随机推荐
- [ Nowcoder Contest 167 #C ] 部分和
\(\\\) \(Description\) 给出一个长度为\(N\)的数组\(A[i]\),保证\(N\)为 \(2\) 的整次幂. 对于每个 \(i\ (i\in [0,N))\)求所有满足\(( ...
- python--12、索引知识
MySQL索引及优化 影响性能的因素 需求:一个论坛帖子总量的统计,附加要求:实时更新.从功能上来看非常容易实现,执行一条 SELECT COUNT(*) from 表名 的 Query 就可以得到结 ...
- Farseer.net轻量级开源框架 入门篇:Where条件的终极使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 ...
- POJ_3041_Asteroids
参考自: http://user.qzone.qq.com/289065406/blog/1299322465 解题思路: 把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1.V2,其中| V1 ...
- CAD删除组(网页版)
主要用到函数说明: _DMxDrawX::DeleteGroup 根据组名,删除组.详细说明如下: 参数 说明 BSTR pszName 组名 js代码实现如下: 1 2 3 4 5 6 7 8 9 ...
- 梦想MxWeb3D协同设计平台 2019.02.28更新
梦想MxWeb3D协同设计平台 2019.02.28更新 SDK开发包下载地址: http://www.mxdraw.com/ndetail_10130.html 在线演示网址: http://www ...
- Angular ZoneJS 原理
Zone.js到底是如何工作的? 原文链接: blog.kwintenp.com 如果你阅读过关于Angular 2变化检测的资料,那么你很可能听说过zone.Zone是一个从Dart中引入的特性并被 ...
- [NOIP2017普及]跳房子
我太弱了... 单调队列优化DP+二分答案. #include <algorithm> #include <iostream> #include <cstdlib> ...
- C语言二叉树的创建、(先中后序)遍历以及存在的问题
#include<stdlib.h> #include<stdio.h> #define True 1 #define False 0 typedef char TElemTy ...
- 微信小程序官方指南手册,教你如何使用微信小程序!
2017年1月9日,小程序如约而至.程序员们都讨论的热火朝天,但是真正使用过微信小程序的又有几个呢?下面今天我们给大家介绍下微信小程序到底应该如何使用? 首先,你的微信必须是最新版本的,微信官方是从要 ...