« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称: 日志总数:8 评论数量:19 留言数量:0 访问次数:69866 建立时间:2006年8月1日 |

| |
[Java]DIP:依赖倒转原则 读书笔记
爱睡觉的猫 发表于 2006/8/10 15:59:28 |
传统的过程化设计的设计方法倾向于使高层的模块依赖于低层次的模块,抽象层次依赖于具体层次。倒转原则就是要把这个错误的依赖关系倒转过来,这就是倒转依赖原则的由来。
在面向对象的系统中,两个类之间通常是三种依赖关系:
1. 零耦合:两个类之间没有耦合关系
2. 具体耦合:具体耦合关系发生在两个具体的类之间,经由一个类引用另一个类造成
3. 抽象耦合:抽象耦合发生在一个具体类和一个抽象之间 或者JAVA接口之间,使两个必须发生关系的类之间存在最大的灵活性。
通常我们对DIP的表述为:抽象不应当依赖于细节;细节应当依赖于抽象。另一种表述为:针对接口编程,不要针对实现编程。也就是说我们应当使用JAVA接口和抽象JAVA类进行变量的类型声明、方法的返回类型说明,以及数据类型的转换等。要保证做到这一点,一个具体的JAVA类应当只实现JAVA接口和抽象JAVA类中声明过的方法,而不应当给出多余的方法。
引用对象的抽象类型:在很多情况下,一个java程序需要引用一个对象,这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型,这个就是针对接口编程的含义。比如说,蛋代表抽象,鸡代表具体,那么鸡应依赖于蛋,而蛋不应当依赖于鸡,假设蛋使java接口或者java抽象类,鸡是一个具体类,X是一个变量,那么声明变量应该是:蛋 X = new 鸡(),而不应当是 鸡 X = new 鸡()
只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明、方法的返回类型的声明、属性变量的类型声明等。
联合使用JAVA接口和JAVA抽象类:由于抽象类具有提供缺省实现的优点,而接口具有其他的优点,所以联合使用两者是很好的选择。首先,声明类型的工作是由接口承担,但是同时给出的还有一个抽象类,为这个接口提供一个缺省实现。其他同属于这个抽象类型的具体类可以选择实现这个接口,也可以选择继承自这个抽象类。如果需要向接口加入一个方法的话,只要同时向这个抽象类加入这个方法的具体实现就可以了,因为继承自这个抽象类的子类都会从这个抽象类得到这个具体方法。
DIP虽然很强大,但是不容易实现,应为依赖关系倒转的缘故,对象的创建可能会使用对象工厂,以避免对具体类的使用。此外,DIP假定所有的具体类都是会变化的,这也不总是正确的,如果一个具体类是稳定的、不会发生变化的,那么使用这个具体类的客户端完全可以依赖于这个具体类型。 |
|
|