- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
l06b可重用跟可维护原则--依赖倒换原则
面向对象设计方法 为何而“倒转” 倒转的意义: 传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。倒转原则就是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的来由。(抽象层次依赖于具体层次) 为何而“倒转” 抽象层次含有宏观的和重要商务逻辑,是必然性的体现,而具体层次是含有一些次要的与实现有关的算法和逻辑,带有相当大的偶然性选择。 复用与可维护性的“倒转” 从复用的角度来看,高层次的模块是设计者应当复用的。但是传统的过程性的设计中,复用却侧重于具体层次模块的复用,比如算法复用,数据结构复用,函数库复用等,都不可避免是具体层次模块的复用。较高层次的结构依赖于较低层次的结果,接下去不断的循环直到依赖于每一行的代码。较低层次的修改就会影响到较高层次的修改,直到高层次逻辑的修改 传统的做法也强调具体层次上的可维护性,而不是高层次上的可维护性。 从复用的意义上来说,既然抽象层次含有一个应用系统最重要的宏观商务逻辑,是作战略性判断和决定的地方,那么抽象层次就应当是较为稳定的,应当是复用的重点。由于现有的复用侧重于具体模块和细节的复用,因此,“倒转”一词是指复用应当将复用的重点放在抽象层次上。 最重要的宏观商务逻辑也应当是维护重点 遵守依赖倒转原则会带来复用和可维护性的“倒转”。 依赖倒转原则 三种耦合关系 1.零耦合:如果两个类没有耦合关系,就称为零耦合。 2.具体耦合:具体性耦合发生在两个具体的(可实例化的)类之间,经由一个类对另一个具体类的直接引用造成的。 3.抽象耦合:抽象耦合关系发生在一个具体类和一个抽象类(或者Java接口)之间,使两个必须发生联系的类之间存有最大的灵活性。 什么是依赖倒转原则 简单的说,DIP要求客户端依赖于抽象耦合。依赖倒转的表述是:抽象不应当依赖于细节,细节应当依赖于抽象。 另一种表述是:要针对接口编程,不要针对实现编程。 (要实现,一个具体Java类应当只实现Java接口和抽象Java类中声明过的方法,而不应当给出多余的方法) 倒转依赖关系强调一个系统内的实体之间关系的灵活性。 变量的静态类型和真实类型 变量被声明时的类型叫做变量的静态类型,变量所引用的对象的真实类型叫做变量的实际类型。 List employees=new Vector(); 上述代码中,employees变量的静态类型是List,而它实际类型是Vector。 引用对象的抽象类型 在很多情况下,一个Java程序需要引用一个对象。如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就是针对接口编程的含义。 如果“蛋”代表抽象,“鸡”代表具体,那么,依赖倒转原则相当于在说,“鸡”应当依赖于“蛋”,先有蛋,后有鸡。 如右图所示,那么变量的 声明应当是: 蛋 x=new 鸡(); 例子:创建employee类 尽量不要使用: Vector employees=new Vector(); 应当使用: List employees=new Vector(); 区别:前者使用具体类作为变量的类型,而后者使用一个抽象类(List是Java接口)作为类型。 好处:在决定将Vector类型转换成ArrayList时,需要改动的很少: List employees=new ArrayList(); 引用对象的抽象类型的优点 程序具有更好的灵活性,因为除去调用构造子的一行语句之外,程序的其余部分根本察觉不到变化。 因此,只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括变量的类型声明,方法返还类型的声明,属性变量类型的声明等。 对象的创建 一般而言,在创建一个对象时,Java语言要求使用new关键词以及这个类型本身。如上所示。 一旦对象已经被创建出来,那么就可以灵活的使用这个对象的抽象类型来引用它。 因此,Java语言创建一个对象的过程是违背“开—闭”原则以及依赖倒转原则的。虽然在这个类被创建出来以后,可以通过多态性使得客户端依赖于其抽象模型。 正是由于这个原因,设计模式给出了多个创建模式,特别是工厂模式,用于解决对象创建过程中的依赖倒转问题。 怎样做到依赖倒转原则 以抽象方式耦合是依赖倒转原则的关键。 由于一个抽象耦合关系总要涉及到具体类从抽象类继承,并且保证在任何引用到基类的地方都可以转换成其子类,因此,里氏代换原则是依赖倒转原则的基础。 抽象方式
原创力文档


文档评论(0)