L05B可重用和可維護原則-依賴倒換原則_第1頁
L05B可重用和可維護原則-依賴倒換原則_第2頁
L05B可重用和可維護原則-依賴倒換原則_第3頁
L05B可重用和可維護原則-依賴倒換原則_第4頁
L05B可重用和可維護原則-依賴倒換原則_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

面向?qū)ο笤O(shè)計方法(UML)

L05B可重用和可維護原則—依賴倒換原則.吳小竹為何而“倒轉(zhuǎn)”倒轉(zhuǎn)的意義: 傳統(tǒng)的過程性系統(tǒng)的設(shè)計辦法傾向于使高層次的模塊依賴于低層次的模塊;抽象層次依賴于具體層次。依賴倒轉(zhuǎn)原則(DependenceInversionPrinciple,DIP)就是要把這個錯誤的依賴關(guān)系倒轉(zhuǎn)過來,這就是“依賴倒轉(zhuǎn)原則”的來由。為何而“倒轉(zhuǎn)”抽象層次含有宏觀的和重要業(yè)務(wù)邏輯,是必然性的體現(xiàn),而具體層次是含有一些次要的與實現(xiàn)有關(guān)的算法和邏輯,帶有相當大的偶然性選擇。復(fù)用與可維護性的“倒轉(zhuǎn)”

從復(fù)用的角度來看,高層次的模塊是設(shè)計者應(yīng)當復(fù)用的。但是傳統(tǒng)的過程性的設(shè)計中,復(fù)用卻側(cè)重于具體層次模塊的復(fù)用,比如算法復(fù)用,數(shù)據(jù)結(jié)構(gòu)復(fù)用,函數(shù)庫復(fù)用等,都不可避免是具體層次模塊的復(fù)用。較高層次的結(jié)構(gòu)依賴于較低層次的結(jié)果,接下去不斷的循環(huán)直到依賴于每一行的代碼。較低層次的修改就會影響到較高層次的修改,直到高層次邏輯的修改.依賴倒轉(zhuǎn)原則 三種耦合關(guān)系 1.零耦合:如果兩個類沒有耦合關(guān)系,就稱為零耦合。

2.具體耦合:具體耦合發(fā)生在兩個具體的(可實例化的)類之間,經(jīng)由一個類對另一個具體類的直接引用造成的。

3.抽象耦合:抽象耦合關(guān)系發(fā)生在一個具體類和一個抽象類(或者Java接口)之間,使兩個必須發(fā)生聯(lián)系的類之間存有最大的靈活性。什么是依賴倒轉(zhuǎn)原則

簡單的說,DIP要求依賴于抽象耦合。依賴倒轉(zhuǎn)的表述是:抽象不應(yīng)當依賴于細節(jié),細節(jié)應(yīng)當依賴于抽象。 另一種表述是:要針對接口編程,不要針對實現(xiàn)編程。 變量的靜態(tài)類型和真實類型

變量被聲明時的類型叫做變量的靜態(tài)類型,變量所引用的對象的真實類型叫做變量的實際類型。

Listemployees=newVector();上述代碼中,employees變量的靜態(tài)類型是List,而它實際類型是Vector。引用對象的抽象類型

在很多情況下,一個Java程序需要引用一個對象。如果這個對象有一個抽象類型的話,應(yīng)當使用這個抽象類型作為變量的靜態(tài)類型。這就是針對接口編程的含義。

如果“蛋”代表抽象,“雞”代表具體,如圖所示,那么變量的聲明應(yīng)當是:蛋x=new雞();

蛋(抽象類)雞(具體類)例子:創(chuàng)建employee類 盡量不要使用:

Vectoremployees=newVector();應(yīng)當使用:

Listemployees=newVector();區(qū)別:前者使用具體類作為變量的類型,而后者使用一個抽象類(List是Java接口)作為類型。好處:在決定將Vector類型轉(zhuǎn)換成ArrayList時,需要改動的很少:

Listemployees=newArrayList();引用對象的抽象類型的優(yōu)點

程序具有更好的靈活性,因為除去調(diào)用構(gòu)造函數(shù)的一行語句之外,程序的其余部分根本察覺不到變化。因此,只要一個被引用的對象存在抽象類型,就應(yīng)當在任何引用此對象的地方使用抽象類型,包括變量的類型聲明,方法返還類型的聲明,屬性變量類型的聲明等。怎樣做到依賴倒轉(zhuǎn)原則

以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。由于一個抽象耦合關(guān)系總要涉及到具體類從抽象類繼承,并且保證在任何引用到基類的地方都可以轉(zhuǎn)換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。

抽象方式耦合的局限:在某些情況下,如果一個具體類發(fā)生變化的可能性很小,那么抽象耦合能發(fā)揮的好處便十分有限,這時使用具體耦合反而會更好。Java對抽象類型的支持

Java語言提供了Java接口和Java抽象類實現(xiàn)對抽象類型的支持。二者區(qū)別1·Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以; 2·對于Java抽象類,Java語言限制一個類只能從最多一個超類繼承;而Java接口,一個類可以實現(xiàn)任意多個Java接口

3·從代碼重構(gòu)的角度來講——將一個單獨的Java具體類重構(gòu)成一個Java接口的實現(xiàn)是很容易的;而為一個已有的具體類添加一個Java抽象類卻不那么容易; 4·Java接口是定義混合類型(MixinType)的理想工具將一個單獨的Java具體類重構(gòu)成一個Java接口的實現(xiàn)

只需要聲明一個Java接口,并將重要的方法添加到接口聲明中,然后在具體類定義語句后面加上一個合適的implements子句就可以了。Java接口定義混合類型

所謂混合類型,就是在一個類的主類型之外的次要類型。比如Hashtable類就有多個類型。它的主要類型是Map,這是一種Java聚集。而Cloneable接口則給出一個次要類型,這個類型說明這個類的實例是可以安全克隆的。同樣,Serializable也是一個次要類型,它表明這個類的實例是可以串行化的。如下所示:DictionaryMapCloneableJava.io.SerializableJava.util.Hashtable一個例子:

賬號,賬號的種類和賬號的狀態(tài)Account類有兩個聚合關(guān)系——均是靜態(tài)抽象類型,一個指向AccountType(該類型有Saving和Checking兩種具體子類),另一個指向AccountStatus(該類型有Open和OverDrawn兩種具體實現(xiàn))。如下圖所示: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:具體實現(xiàn)類Saving源代碼publicclassSavingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代碼6:具體實現(xiàn)類Checking源代碼publicclassCheckingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代碼7:具體實現(xiàn)類Open源代碼publicclassOpenextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}代碼8:具體實現(xiàn)類Overdrawn源代碼publicclassOverdrawnextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}

在這個例子里,Account類依賴于AccountType和AccountStatus兩個抽象類型,而不是它們的子類型。AccountType有兩個子類型:儲蓄賬號:以Saving具體類代表支票賬號:以Checking具體類代表AccountStatus也有兩個子類型:可用狀態(tài):以O(shè)pen具體類代表超支狀態(tài):以O(shè)verdrawn具體類為代表Account類并不依賴于具體類,因此當有新的具體類型添加到系統(tǒng)中時,Account類不必改變。例如,如果系統(tǒng)引進了一個新型的賬號:MoneyMarket類型,Account類以及系統(tǒng)里面所有其他的依賴于AccountType抽象類的客戶端均不必改變。其源代碼如下:代碼9:具體實現(xiàn)類MoneyMarket源代碼public

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論