第8章 依赖倒转原则(DIP)
依赖倒转原则:要依赖于抽象,不要依赖于具体。
8.3 依赖倒转原则
三种耦合关系:
1)零耦合
2)具体耦合:发生在两个具体的(可实例化的)类之间。
3)抽象耦合:发生在一个具体类和一个抽象类(或者Java接口)之间。
what?
抽象不应当依赖于细节;细节应当依赖于抽象。
另一种表述:
要针对接口编程,不要针对实现编程。
一个具体Java类应当只实现Java接口和抽象Java类中声明过的方法,而不应当给出多余的方法。
变量的静态类型:变量被声明时的类型。
变量的真实类型:变量所引用的对象的真实类型。
引用对象的抽象类型
在很多情况下,一个Java程序需要引用一个对象。这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为
变量的静态类型。这就是
针对接口编程的含义。
例如:蛋 x = new 鸡();
而非:鸡 x = new 鸡();
List employees = new Vector();
而非:Vector employees = new Vector();
8.4 how?
工厂方法模式
*模版方法模式
*迭代子模式
*
8.5 Java对抽象类型的支持
Java接口与Java抽象类的区别:
1)Java抽象类可以提供某些方法的部分实现,而Java接口则不可以。
2)一个抽象类的实现只能由这个抽象类的子类给出;任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口。
3)从代码重构的角度上讲,将一个单独的Java具体类重构成一个Java接口的实现是很容易的;而为一个已有的具体类添加一个Java抽象类作为抽象类型却不那么容易,因为这个具体类有可能已经有一个超类。
4)Java接口是定义混合类型的理想工具。
联合使用Java接口和Java抽象类
缺省适配模式
8.8 优缺点
不容易实现;
假定所有的具体类都是会变化的。