面向对象的六大设计原则(三):依赖倒置原则

11 篇文章 1 订阅


三、依赖倒置原则:Dependence Inversion Principle(DIP)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。什么意思呢?高层模块就是调用端,底层模块就是具体的操作类。抽象是指抽象类或者接口,两者都不能直接被实例化;而细节就是具体的实现类,可以直接被实例化,也就是可以直接new出来的对象。依赖倒置原则的和核心思想就是面向接口或者说面向抽象编程。下面我们来看一个具体的例子。

class Video {
	public void run() {
		System.out.println("正常播放MP4视频");
	}
}

class VideoPlayer {

	public void play(Video video) {
		video.run();
	}

}

public class VideoTest {
	public static void main(String[] args) {
		VideoPlayer player = new VideoPlayer();
		Video video = new Video();
		player.play(video);
	}
}

这里我们做了一个简单的视频播放软件,播放一段MP4的视频。

运行结果 :

<pre name="code" class="java">正常播放MP4视频
 一段时间过后,来了一段AVI格式的视频,这个时候我们的视频播放器就没有办法了,于是我们必须修改代码,修改代码如下 

class VideoMP4 {
	public void run() {
		System.out.println("正常播放MP4视频");
	}
}

class VideoAVI {
	public void run() {
		System.out.println("正常播放AVI视频");
	}
}

class VideoPlayer {

	public void play(VideoMP4 video) {
		video.run();
	}

	public void play(VideoAVI video) {
		video.run();
	}

}

public class VideoTest {
	public static void main(String[] args) {
		VideoPlayer player = new VideoPlayer();
		VideoAVI video = new VideoAVI();
		player.play(video);
	}
}

废了九牛二虎之力,修改了所有Java类,终于AVI格式的视频也能播放了。好了,以后每当新加一种视频格式,我们就要不断的修改VideoPlayer。这显然不是我们所希望的。出现这个问题的原因就是VideoPlayer和Video高度耦合,我们必须降低他们直接的耦合。这里我们引入一个IVideo的接口

public interface IVideo{
	public void run();
}

VideoPlayer和Video不再依赖于细节,而依赖于IVideo接口,这就符合我们上面所说的依赖倒置原则。修改之后的代码如下

class VideoMP4 implements IVideo{
	public void run() {
		System.out.println("正常播放MP4视频");
	}
}

class VideoAVI implements IVideo{
	public void run() {
		System.out.println("正常播放AVI视频");
	}
}

class VideoWMV implements IVideo{
        public void run(){
                System.out.prinitl("正常播放WMV视频");
        }


}

class VideoPlayer {

	public void play(IVideo video) {
		video.run();
	}

	 

}

public class VideoTest {
	public static void main(String[] args) {
		VideoPlayer player = new VideoPlayer();
		IVideo video = new VideoAVI();
		player.play(video);
	}
}

通过这样修改之后,以后你无论新添多少中视频格式,VideoPlayer都无需修改一行代码。在实际开发中也是,一旦我们的播放器开发完成,如果反复对其进行修改的话,产生的风险是非常大,极易出现问题。这里ViderPlayer是调用端,也就是依赖倒置中的高层模块,与之相应的Video就是底层模块。这就是高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。总之一句话依赖倒置的核心思想:面向接口编程!理解了面向接口编程也就理解了依赖倒置原则!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值