依赖倒置原则 (DIP)
核心内容:
1、高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。


以 FishGUI 为实例,从实践的角度来看。假设 FishGUI 框架系统必须要移植到不同的操作系统(如: Windows 和 Unix ),为了使操作系统的 变化不影响框架层,就必须抽象出一个操作系统适配器接口, FishGUI 框架层中的类只依赖于该接口,而该接口的派生类具体实现到不同操作系统的调用。这个实现是符合依赖倒置原则的。
对应上图用代码去实现如下:
接口编写 ( 对应上图中的标识 1)
package dip;
/**
* 定制一个播放flash功能接口
* @author renyy
*
*/
public interface IFlashPlay {
public void playFlash();
}
2 、在 windows 系统下实现播放 flash 的方式代码如下(对应上图中的标识 2 ):
package dip;
/**
* 在windows下的flash播放器
* @author renyy
*
*/
public class WindowsFlashPlay implements IFlashPlay{
public void playFlash() {
System.out.println("windows flashplayer is working!");
}
}
在 unix 系统下实现播放 flash 的方式代码如下(对应上图中的标识 2 ):
package dip;
/**
* 在unix下flash播放器
* @author renyy
*
*/
public class UnixFlashPlay implements IFlashPlay {
public void playFlash() {
System.out.println("unix flashplayer is working!");
}
}
使用方用户根据自己的情况所需实现 flash 播放的代码如下(对应上图中的标识 3 ):
package dip;
/**
* 依赖倒置原则(DIP)
*
* 用户根据自己的需要去使用不同的flash播放器
*
* @author renyy
*
*/
public class UserFlashPlay implements IFlashPlay {
private IFlashPlay flash = new WindowsFlashPlay(); // 用户确定是用windows的flashplayer播放flash
// private IFlashPlay flashPlay = new
// UnixFlashPlay();//用户确定是用unix的flashplayer播放flash
public void playFlash() {
flash.playFlash();// 用户自己去决定我要用那种系统的播放方式。
// flashPlay.playFlash();
}
public static void main(String[] args) {
new UserFlashPlay().playFlash();
}
}
运行后输入:
|
windows flashplayer is working! |
这样等用户发现自己需要在 unix 系统下播放 flash 时就可以用我们的
UnixFlashPlay 这个实现类提供的方法来在 unix 下播放 flash ,而设计者无须修改任何代码。
本文通过FishGUI框架移植实例,详细介绍了依赖倒置原则(DIP)。解释了如何通过抽象接口减少不同操作系统间的耦合度,确保框架层不受底层变动的影响。
2427

被折叠的 条评论
为什么被折叠?



