L05B可重用和可维护原则-依赖倒换原则_第1页
L05B可重用和可维护原则-依赖倒换原则_第2页
L05B可重用和可维护原则-依赖倒换原则_第3页
L05B可重用和可维护原则-依赖倒换原则_第4页
L05B可重用和可维护原则-依赖倒换原则_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象设计方法(UML)

L05B可重用和可维护原则—依赖倒换原则.吴小竹为何而“倒转”倒转的意义: 传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。依赖倒转原则(DependenceInversionPrinciple,DIP)就是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的来由。为何而“倒转”抽象层次含有宏观的和重要业务逻辑,是必然性的体现,而具体层次是含有一些次要的与实现有关的算法和逻辑,带有相当大的偶然性选择。复用与可维护性的“倒转”

从复用的角度来看,高层次的模块是设计者应当复用的。但是传统的过程性的设计中,复用却侧重于具体层次模块的复用,比如算法复用,数据结构复用,函数库复用等,都不可避免是具体层次模块的复用。较高层次的结构依赖于较低层次的结果,接下去不断的循环直到依赖于每一行的代码。较低层次的修改就会影响到较高层次的修改,直到高层次逻辑的修改.依赖倒转原则 三种耦合关系 1.零耦合:如果两个类没有耦合关系,就称为零耦合。

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

3.抽象耦合:抽象耦合关系发生在一个具体类和一个抽象类(或者Java接口)之间,使两个必须发生联系的类之间存有最大的灵活性。什么是依赖倒转原则

简单的说,DIP要求依赖于抽象耦合。依赖倒转的表述是:抽象不应当依赖于细节,细节应当依赖于抽象。 另一种表述是:要针对接口编程,不要针对实现编程。 变量的静态类型和真实类型

变量被声明时的类型叫做变量的静态类型,变量所引用的对象的真实类型叫做变量的实际类型。

Listemployees=newVector();上述代码中,employees变量的静态类型是List,而它实际类型是Vector。引用对象的抽象类型

在很多情况下,一个Java程序需要引用一个对象。如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就是针对接口编程的含义。

如果“蛋”代表抽象,“鸡”代表具体,如图所示,那么变量的声明应当是:蛋x=new鸡();

蛋(抽象类)鸡(具体类)例子:创建employee类 尽量不要使用:

Vectoremployees=newVector();应当使用:

Listemployees=newVector();区别:前者使用具体类作为变量的类型,而后者使用一个抽象类(List是Java接口)作为类型。好处:在决定将Vector类型转换成ArrayList时,需要改动的很少:

Listemployees=newArrayList();引用对象的抽象类型的优点

程序具有更好的灵活性,因为除去调用构造函数的一行语句之外,程序的其余部分根本察觉不到变化。因此,只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括变量的类型声明,方法返还类型的声明,属性变量类型的声明等。怎样做到依赖倒转原则

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

抽象方式耦合的局限:在某些情况下,如果一个具体类发生变化的可能性很小,那么抽象耦合能发挥的好处便十分有限,这时使用具体耦合反而会更好。Java对抽象类型的支持

Java语言提供了Java接口和Java抽象类实现对抽象类型的支持。二者区别1·Java抽象类可以提供某些方法的部分实现,而Java接口不可以; 2·对于Java抽象类,Java语言限制一个类只能从最多一个超类继承;而Java接口,一个类可以实现任意多个Java接口

3·从代码重构的角度来讲——将一个单独的Java具体类重构成一个Java接口的实现是很容易的;而为一个已有的具体类添加一个Java抽象类却不那么容易; 4·Java接口是定义混合类型(MixinType)的理想工具将一个单独的Java具体类重构成一个Java接口的实现

只需要声明一个Java接口,并将重要的方法添加到接口声明中,然后在具体类定义语句后面加上一个合适的implements子句就可以了。Java接口定义混合类型

所谓混合类型,就是在一个类的主类型之外的次要类型。比如Hashtable类就有多个类型。它的主要类型是Map,这是一种Java聚集。而Cloneable接口则给出一个次要类型,这个类型说明这个类的实例是可以安全克隆的。同样,Serializable也是一个次要类型,它表明这个类的实例是可以串行化的。如下所示:DictionaryMapCloneableJava.io.SerializableJava.util.Hashtable一个例子:

账号,账号的种类和账号的状态Account类有两个聚合关系——均是静态抽象类型,一个指向AccountType(该类型有Saving和Checking两种具体子类),另一个指向AccountStatus(该类型有Open和OverDrawn两种具体实现)。如下图所示:Account+Account(accType:AccountType)+depoist(amt:float)voidAccountStatus+sendCorrespondence():voidAccount+depoist(amt:float)voidSaving+depoist(amt:float)voidAccountType+depoist(amt:float)voidOverdrawn+sendCorrespondence():voidOpen+sendCorrespondence():void代码2:Account类的源代码PublicclassAccount{privateAccountTypeaccountType;privateAccountStatusaccountStatus;publicAccount(AccountTypeaccType){//writeyourcodehere}publicvoiddeposit(floatamt){//writeyourcodehere}}代码3:抽象类AccountType源代码abstractpublicclassAccountType{publicabstractvoiddeposit(floatamt);}代码4:抽象类AccountStatus源代码abstractpublicclassAccountStatus{publicabstractvoidsendCorrespondence();}代码5:具体实现类Saving源代码publicclassSavingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代码6:具体实现类Checking源代码publicclassCheckingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代码7:具体实现类Open源代码publicclassOpenextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}代码8:具体实现类Overdrawn源代码publicclassOverdrawnextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}

在这个例子里,Account类依赖于AccountType和AccountStatus两个抽象类型,而不是它们的子类型。AccountType有两个子类型:储蓄账号:以Saving具体类代表支票账号:以Checking具体类代表AccountStatus也有两个子类型:可用状态:以Open具体类代表超支状态:以Overdrawn具体类为代表Account类并不依赖于具体类,因此当有新的具体类型添加到系统中时,Account类不必改变。例如,如果系统引进了一个新型的账号:MoneyMarket类型,Account类以及系统里面所有其他的依赖于AccountType抽象类的客户端均不必改变。其源代码如下:代码9:具体实现类MoneyMarket源代码public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论