本文主要是介绍面向对象的六大设计原则(三):依赖倒置原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
三、依赖倒置原则: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就是底层模块。这就是高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。总之一句话依赖倒置的核心思想:面向接口编程!理解了面向接口编程也就理解了依赖倒置原则!
这篇关于面向对象的六大设计原则(三):依赖倒置原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!