目录
1.简介
依赖倒置原则(Dependence Inversion Principle),简称DIP。
2.定义
高层模块不应该依赖于低层模块,两者都应该依赖其抽象。抽象不应该依赖细节。细节应该依赖抽象。这里的低层模块就是不可分割的原子逻辑,原子逻辑再组装就成了高级模块。抽象是指接口或者抽象类,两者都是不能直接被实例化;细节就是实现类,实现接口或继承抽象类而产生的类,可以直接被直接实例化。所谓的能否直接实例化也就在于是否可以通过关键字new产生的一个对象。简单来说就是模块之间的依赖都是通过抽象发生,实现类之间并不直接产生依赖关系,其依赖关系都是通过接口或者抽象类产生的。实现类依赖接口或抽象类,但接口或抽象类不依赖实现类。这也正好对应面向接口编程。
3.依赖
传说中的实现方式有三种,且听我一一道来。假设存在两个接口IFace1和IFce2,IFace1的实现类依赖IFace2。
3.1 构造函数传递依赖对象
public interface IFace1{
public void method1();
}
public interface IFace2{
public void method2();
}
public class face1 implements IFace1{
private IFace2 face2;
public face1(IFace2 face2) {
this.face2 = face2;
}
public void method1() {
this.face2.method2();
}
}
3.2 Setter方法传递依赖对象
public interface IFace1{
public void method1();
}
public interface IFace2{
public void method2();
}
public class face1 implements IFace1{
private IFace2 face2;
public void setFace2(IFace2 face2) {
this.face2 = face2;
}
public void method1() {
this.face2.method2();
}
}
3.3 接口声明依赖对象
public interface IFace1{
public void method1();
}
public interface IFace2{
public void method2();
}
public class face1 implements IFace1{
public void method1(IFace2 face2) {
face2.method2();
}
}
4.举例
想必大家都看过水浒传吧,其中有一人身上刺满一身青龙,刀枪剑戟十八班武艺样样精通,江湖人称九龙纹龙史进是也。
public interface IWupo {
public void martialArts(IWeapon weapon);
}
public interface IWeapon {
public void attack();
}
public class Wupo implements IWupo {
public void martialArts(IWeapon weapon) {
weapon.attack();
}
}
public class Sword implements IWeapon {
public void attack() {
System.out.println("看我独孤九剑");
}
}
public class Stick implements IWeapon {
public void attack() {
System.out.println("打狗棍法,看棍");
}
}
public class Shuifu {
public static void main(String[] args) {
IWupo shiJin = new Wupo();
IWeapon sword = new Sword();
shiJin.martialArts(sword);
}
}
这样,如果史进不想用剑了,改用其他兵器,我们可以只对高层模块进行修改
public class Shuifu {
public static void main(String[] args) {
IWupo shiJin = new Wupo();
IWeapon stick = new Stick();
shiJin.martialArts(stick);
}
}
这便是DIP的核心,面向接口编程。