连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则

news/2024/7/3 4:01:52

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
================================================ 



http://www.niftyadmin.cn/n/1980864.html

相关文章

希捷银河声音大_技术成熟:希捷表示将直接推出 24TB HAMR 硬盘

本文转自:IT之家作者:信鸽随着 SSD 固态硬盘技术的稳步推进,以及国产 NAND 颗粒的成功量产,传统机械硬盘厂商面临着越来越大的压力,而 HAMR(热辅助磁记录)技术,是提高存储密度的新一代解决方案。据外媒 BLO…

Kali渗透测试——WOL-E

网络唤醒工具WOL-E 网络唤醒(WOL)是非常有用的一个功能。电脑开启WOL功能后,当电脑长期没人使用会进入待机状态。这时,其他电脑就可以借助WOL功能,通过网络唤醒该计算机。在渗透测试中,寻找网络中支持网络唤…

zemax迈克尔逊干涉仪_诺贝尔物理学奖史演义系列(六)——迈克尔逊

迈克尔逊干涉仪是光学领域里最常见的干涉仪,是近代物理学的重要实验仪器之一。清晨起床,一缕阳光洒进房间,寓示着新的一天开始了。虽然太阳离地球非常遥远,但阳光只需要几秒钟就可以到达地面,由此可见光的速度非常快。…

家用简单电线路图_口诀来了!家用中央空调怎么选?一听二看三感觉

家用中央空调舒适、美观,现在很多业主在装修时都会考虑一下。但由于对家用中央空调不是很了解,面对市场上各品类空调时,往往无从下手。今天,未来舒适家小编就教大家一个简单的小诀窍,“一听、二看、三感觉”&#xff0…

mysql5.7.10 源码编译安装记录 (centos6.4)【转】

一、准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系统自带mysql yum -y remove mysql-* //卸载mysql rpm -e --nodeps mysql-5.1.73-3.el6_5.x86_64 //卸载mysql 1.2 卸…

诸葛io的技术架构图_诸葛io携手飞书,助力企业数字化转型升级

近日,北京诸葛云游科技有限公司(以下简称诸葛公司)与飞书正式达成战略合作,推动产品层面的融合, 积极探索创新协作的商业模式,双方将在业务合作,客户资源,渠道增值等多方面开展深度合作,携手推进…

【51NOD-0】1011 最大公约数GCD

【算法】欧几里德算法 #include<cstdio> int gcd(int a,int b) {return b0?a:gcd(b,a%b);} int main() {int a,b;scanf("%d%d",&a,&b);printf("%d",gcd(a,b));return 0; } View Code转载于:https://www.cnblogs.com/onioncyc/p/6910087.htm…