`
student_lp
  • 浏览: 437210 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

     实现“开-闭”原则的关键是抽象化,并且从抽象化导出具体化实现。如果说“开-闭”原则是面向对象设计的目标的话,依赖倒转原则就是这个面向对象设计的主要机制。依赖倒转原则讲的是:要依赖于抽象类,不要依赖于具体

一、为何而“倒转”

   简单的说,传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块:抽象层次依赖于具体层次。倒转原则是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的由来。

     抽象层次依赖于具体层次的含义是什么呢?抽象层次包含的是应用系统的商务逻辑和宏观的。对整个系统来说重要的战略性决定,是必然性的体现;而具体层次则含有一些次要的与实现有关的方法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是会经常变动的,不能避免出现错误。抽象层次依赖于具体层次,使许多具体层次的细节的算法变化立即响应到抽象层次的宏观商务逻辑,这导致微观决定宏观,战术决定战略,偶然决定必然,这岂不是很荒唐。

     抽象层次依赖于具体层次显然是不对的。依赖倒转原则就是要把错误的依赖关系倒转过来。依赖倒转原则是COM、CORBA、JavaBean以及EJB等构件模型背后的基本原则。

二、复用和可维护性的“倒转”

    从复用的角度来看,高层次的模块是设计者应当复用的。但是在传统的过程性的设计中,复用却侧重于具体层次模块的复用,比如算法的复用、数据结构的复用、函数库的复用等,都不可避免是具体层次模块的复用。较高曾侧的结构依赖于较低层次的结构,较低层次的结构又进一步依赖于更低层次的结构,如此继续。较低层次上的修改,会造成较高层次的修改,直到高层次逻辑的修改。

    同样,传统的做法也强调具体层次上的可维护性,包括一个函数、数据结构等可维护性,而不是高层次上的可维护性。

     从复用的意义上讲,既然抽象层次含有一个应用系统最重要的宏观商务逻辑,是做战略判断和决定的地方,那么抽象层次应当是较为稳定的,应当是复用的重点。由于现有的复用侧重于具体模块和细节的复用,因此,“倒转”一词则是指复用应当将复用的重点放在抽象层次上。如果抽象层次的模块相对独立于具体层次的模块的话,那么抽象层次的模块的复用便是相对较为容易的了。

     同样,最重要的宏观商务逻辑也应当是维护的重点,而不是相反。因此,遵守依赖倒转原则会带来复用和可维护性的“倒转”。

三、依赖倒转原则

1、依赖(或者耦合)关系的种类。

     在面向对象的系统里,两个类之间可以发生三种不同的耦合关系:

     ①零耦合关系:如果两个类没有耦合关系,就称为零耦合;

     ②具体耦合关系:具体性耦合发生在两个具体的(可实例化的)类之间,经由一个类对另一个类的直接引用造成。

     ③抽象耦合关系:抽象耦合关系发生在一个具体类和一个抽象类(或者Java接口)之间,使两个必须发生关系的类之间存在更大的灵活性。

2、依赖倒转原则

     简单的说,依赖倒转原则要求客户端依赖于抽象耦合。依赖倒转原则的表述是:抽象不应当依赖于细节;细节应当依赖于抽象。另一种表述是:要针对接口编程,不要针对实现编程。

     ①针对接口编程的意思就是说,应当使用接口和抽象类进行变量的类型声明、参量的类型声明、方法的返还类型声明,以及数据类型的转换等。

     ②不要针对实现编程的意思是说,不应当使用具体Java类进行变量的类型声明、参量的类型声明、方法的返还类型声明,以及数据类型的转换等。

     要保证做到这一点,一个具体Java类应当只实现接口和抽象类中声明过的方法,而不应当给出多余的方法。倒转依赖关系强调一个系统的实体之间关系的灵活性。基本上,如果我们希望遵守“开-闭”原则,那么倒转依赖原则便是达到要求的途径。

3、总结

     以抽象方式耦合是依赖倒转原则的关键。由于一个抽象耦合关系总是要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒转原则的基础。

     依赖倒转原则是OO设计的核心原则,设计模式的研究和应用是以依赖倒转原则为指导原则的。

4、注意

     一般而言,在创建一个对象时,Java要求使用new关键字以及这个类本身。而一旦这个对象被创建出来,那么就可以灵活使用这个对象的抽象类型来引用它。因此,Java语言中创建一个对象的过程是违背“开-闭”原则以及依赖倒转原则的。虽然在这个类被创建出来以后,可以通过多态性使得客户端依赖于抽象类型。

    正式这个原因,设计模式给出了多个创建模式,特别是工厂模式。用于解决对象创建过程中的依赖倒转问题。其他还可以解决该问题的模式还有模板模式、迭代模式等。

四、墨子论道

     《墨子·小取》中说:“爱人,待周爱人而后为爱人”。换言之,如果“爱人”是一个行为的话,这个行为对所有的人成立。因此,“爱人”之人是抽象之人,所有具体之人皆是抽象“人”的子类型,所以爱人的行为对所有的子类型成立。因此,“取周”便是抽象依赖之意,抽象的依赖使得“爱人”行为对所有的人,包括见过的和没有见过的人都成立。

五、依赖倒转原则的优缺点

     依赖倒转原则虽然很强大,但却是最不容易实现的。因为依赖关系倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类,对不熟悉面向对象的人来说,维护这样的系统需要较好的面向对象的设计知识。

    此外,依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确的。有一些具体类可能是相当稳定、不会发生变化的,消费这个具体类实例的客户端完全可以依赖于这个具体类型,而不必为此发明一个抽象类。

 

 

本文通过总结《java与模式》而来。

分享到:
评论

相关推荐

    依赖倒转原则例子程序DIP.zip

    在DIP的应用中,我们经常看到设计模式如工厂模式、策略模式、观察者模式等,它们都是依赖倒转原则的具体实践。这些模式有助于创建松耦合、高内聚的系统,从而提高软件的可维护性和可扩展性。 总结起来,依赖倒转...

    设计模式之依赖倒转原则

    在C#编程语言中,依赖倒转原则的应用尤其常见,因为C#提供了一些强大的特性来支持这一原则的实现。 1. **定义**: 依赖倒转原则指出,高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。同时,抽象不...

    第二十九讲:基础四依赖倒转原则

    依赖倒转原则(Dependency Inversion Principle,简称DIP)是软件设计中的一个重要原则,它在面向对象编程领域具有深远的影响。这一原则的核心思想是“高层模块不应该依赖于低层模块,两者都应该依赖于抽象”。简单...

    依赖倒置原则Demo

    依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)提出。这个原则指出,高层次的模块不应该依赖于低层次的模块,两者都应该依赖其抽象;...

    设计模式design-pattern-java.pdf

    依赖倒转原则(Dependency Inversion Principle, DIP)建议依赖于抽象而不是具体实现。这有助于降低模块间的耦合度,提高系统的灵活性。 #### 1.2.5 面向对象设计原则之接口隔离原则 接口隔离原则(Interface ...

    面向对象设计原则Java概要.ppt

    依赖倒转原则  依赖倒转原则概述 依赖倒转原则(Dependency Inversion Principle, DIP)强调要依赖于抽象,而不是依赖于具体实现。这意味着高层次的模块不应该依赖于低层次的模块,两者都应该依赖于相同的抽象。 ...

    java设计模式考试题.docx

    5. **依赖倒转原则**:依赖倒转原则(DIP)指出要依赖于抽象,不要依赖于具体实现,即针对接口编程,而不是针对实现编程(选D)。 6. **复用关系**:在设计模式中,优先考虑利用的是委托、继承和创建这三种复用关系...

    面向对象编程的设计原则详述

    4. **依赖倒转原则(DIP)**:高层模块不应依赖于低层模块,两者都应依赖于抽象。抽象不应依赖于具体实现,具体实现应依赖于抽象。这通常通过使用接口或抽象类来实现,使得系统更易于维护和测试。 5. **接口隔离原则...

    设计模式(23种)与设计原则(6种)

    3. **依赖倒转原则**(Dependency Inversion Principle, DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象。这意味着我们应该依赖接口或抽象类,而不是具体的实现。这有助于降低模块间的耦合度。 4. **...

    设计模式——JAVA.docx

    依赖倒转原则(DIP)是开闭原则的基础之一,它强调依赖于抽象,而不是依赖于具体实现。在设计软件时,高层次的模块不应该依赖于低层次的模块,而是应该依赖于抽象;同时,抽象不应该依赖于细节,细节应该依赖于抽象。 ...

    java软件设计模式期末总结

    3. **依赖倒转原则(DIP)**:高阶模块不应该依赖于低阶模块,两者都应该依赖于抽象。这使得代码更加灵活,因为具体的实现可以被替换而不影响高层模块。 4. **里氏替换原则(LSP)**:子类型必须能够替换掉它们的基...

    设计模式六大原则 .docx

    3、依赖倒转原则(DIP) 依赖倒转原则提倡依赖于抽象而非具体实现。这意味着应该编写基于接口或抽象类的代码,而不是直接依赖于具体的实现类。这样做可以提高代码的灵活性,使得更换实现变得更简单。例如,使用工厂...

    Java与模式

    ### 第8章:依赖倒转原则(DIP) 依赖倒转原则提倡依赖于抽象而不是具体实现,本章详细讨论了这一原则的意义、实现方法以及在Java中的支持方式,同时分析了依赖倒转原则的优势和潜在的局限性。 ### 第9章:接口...

    六种设计原则

    4. 依赖倒转原则(DIP): 依赖倒转原则强调高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象。具体实现上,这意味着我们应该依赖于接口而不是具体的实现。例如,使用接口作为参数传递,或者让类依赖于...

    设计模式(Design Patterns).pdf

    3. 依赖倒转原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。这一原则强调面向接口编程,降低模块间的耦合。 4. 接口...

    Java软件开发实战 Java基础与案例开发详解 7-4 软件的可维护与复用设计原则 共12页.pdf

    - 依赖倒转原则在实际中可能需要结合工厂模式等设计模式来实现。 #### 4. 接口分离原则 (Interface Segregation Principle, ISP) 接口分离原则指出,客户端不应该被迫依赖它不使用的方法。也就是说,接口应该足够...

    设计模式案例源代码.zip

    7. **依赖倒转原则(DIP)**:DIP主张高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。在Java中,这意味着应面向接口编程,而不是面向具体实现编程,这样可以降低耦合度,提高灵活性。 8. **里氏替换...

    设计模式复习提纲.doc

    ##### 依赖倒转原则(DIP) 依赖倒转原则强调高层模块不应该依赖于低层模块,而应该依赖于抽象;同时,抽象不应该依赖于细节,而是细节应该依赖于抽象。这个原则通过鼓励面向接口编程而非面向实现编程来实现。 ##### ...

    面向对象的设计的原则 电子版

    4. 依赖倒转原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象接口。依赖倒转原则告诉我们,在软件设计中,高层模块和低层模块都应该依赖于抽象接口,而不是相互依赖。 5. 接口隔离原则(ISP):...

Global site tag (gtag.js) - Google Analytics