版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο笤O(shè)計(jì)方法(UML)
L05B可重用和可維護(hù)原則—依賴倒換原則.吳小竹為何而“倒轉(zhuǎn)”倒轉(zhuǎn)的意義: 傳統(tǒng)的過(guò)程性系統(tǒng)的設(shè)計(jì)辦法傾向于使高層次的模塊依賴于低層次的模塊;抽象層次依賴于具體層次。依賴倒轉(zhuǎn)原則(DependenceInversionPrinciple,DIP)就是要把這個(gè)錯(cuò)誤的依賴關(guān)系倒轉(zhuǎn)過(guò)來(lái),這就是“依賴倒轉(zhuǎn)原則”的來(lái)由。為何而“倒轉(zhuǎn)”抽象層次含有宏觀的和重要業(yè)務(wù)邏輯,是必然性的體現(xiàn),而具體層次是含有一些次要的與實(shí)現(xiàn)有關(guān)的算法和邏輯,帶有相當(dāng)大的偶然性選擇。復(fù)用與可維護(hù)性的“倒轉(zhuǎn)”
從復(fù)用的角度來(lái)看,高層次的模塊是設(shè)計(jì)者應(yīng)當(dāng)復(fù)用的。但是傳統(tǒng)的過(guò)程性的設(shè)計(jì)中,復(fù)用卻側(cè)重于具體層次模塊的復(fù)用,比如算法復(fù)用,數(shù)據(jù)結(jié)構(gòu)復(fù)用,函數(shù)庫(kù)復(fù)用等,都不可避免是具體層次模塊的復(fù)用。較高層次的結(jié)構(gòu)依賴于較低層次的結(jié)果,接下去不斷的循環(huán)直到依賴于每一行的代碼。較低層次的修改就會(huì)影響到較高層次的修改,直到高層次邏輯的修改.依賴倒轉(zhuǎn)原則 三種耦合關(guān)系 1.零耦合:如果兩個(gè)類沒(méi)有耦合關(guān)系,就稱為零耦合。
2.具體耦合:具體耦合發(fā)生在兩個(gè)具體的(可實(shí)例化的)類之間,經(jīng)由一個(gè)類對(duì)另一個(gè)具體類的直接引用造成的。
3.抽象耦合:抽象耦合關(guān)系發(fā)生在一個(gè)具體類和一個(gè)抽象類(或者Java接口)之間,使兩個(gè)必須發(fā)生聯(lián)系的類之間存有最大的靈活性。什么是依賴倒轉(zhuǎn)原則
簡(jiǎn)單的說(shuō),DIP要求依賴于抽象耦合。依賴倒轉(zhuǎn)的表述是:抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。 另一種表述是:要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。 變量的靜態(tài)類型和真實(shí)類型
變量被聲明時(shí)的類型叫做變量的靜態(tài)類型,變量所引用的對(duì)象的真實(shí)類型叫做變量的實(shí)際類型。
Listemployees=newVector();上述代碼中,employees變量的靜態(tài)類型是List,而它實(shí)際類型是Vector。引用對(duì)象的抽象類型
在很多情況下,一個(gè)Java程序需要引用一個(gè)對(duì)象。如果這個(gè)對(duì)象有一個(gè)抽象類型的話,應(yīng)當(dāng)使用這個(gè)抽象類型作為變量的靜態(tài)類型。這就是針對(duì)接口編程的含義。
如果“蛋”代表抽象,“雞”代表具體,如圖所示,那么變量的聲明應(yīng)當(dāng)是:蛋x=new雞();
蛋(抽象類)雞(具體類)例子:創(chuàng)建employee類 盡量不要使用:
Vectoremployees=newVector();應(yīng)當(dāng)使用:
Listemployees=newVector();區(qū)別:前者使用具體類作為變量的類型,而后者使用一個(gè)抽象類(List是Java接口)作為類型。好處:在決定將Vector類型轉(zhuǎn)換成ArrayList時(shí),需要改動(dòng)的很少:
Listemployees=newArrayList();引用對(duì)象的抽象類型的優(yōu)點(diǎn)
程序具有更好的靈活性,因?yàn)槌フ{(diào)用構(gòu)造函數(shù)的一行語(yǔ)句之外,程序的其余部分根本察覺(jué)不到變化。因此,只要一個(gè)被引用的對(duì)象存在抽象類型,就應(yīng)當(dāng)在任何引用此對(duì)象的地方使用抽象類型,包括變量的類型聲明,方法返還類型的聲明,屬性變量類型的聲明等。怎樣做到依賴倒轉(zhuǎn)原則
以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。由于一個(gè)抽象耦合關(guān)系總要涉及到具體類從抽象類繼承,并且保證在任何引用到基類的地方都可以轉(zhuǎn)換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。
抽象方式耦合的局限:在某些情況下,如果一個(gè)具體類發(fā)生變化的可能性很小,那么抽象耦合能發(fā)揮的好處便十分有限,這時(shí)使用具體耦合反而會(huì)更好。Java對(duì)抽象類型的支持
Java語(yǔ)言提供了Java接口和Java抽象類實(shí)現(xiàn)對(duì)抽象類型的支持。二者區(qū)別1·Java抽象類可以提供某些方法的部分實(shí)現(xiàn),而Java接口不可以; 2·對(duì)于Java抽象類,Java語(yǔ)言限制一個(gè)類只能從最多一個(gè)超類繼承;而Java接口,一個(gè)類可以實(shí)現(xiàn)任意多個(gè)Java接口
3·從代碼重構(gòu)的角度來(lái)講——將一個(gè)單獨(dú)的Java具體類重構(gòu)成一個(gè)Java接口的實(shí)現(xiàn)是很容易的;而為一個(gè)已有的具體類添加一個(gè)Java抽象類卻不那么容易; 4·Java接口是定義混合類型(MixinType)的理想工具將一個(gè)單獨(dú)的Java具體類重構(gòu)成一個(gè)Java接口的實(shí)現(xiàn)
只需要聲明一個(gè)Java接口,并將重要的方法添加到接口聲明中,然后在具體類定義語(yǔ)句后面加上一個(gè)合適的implements子句就可以了。Java接口定義混合類型
所謂混合類型,就是在一個(gè)類的主類型之外的次要類型。比如Hashtable類就有多個(gè)類型。它的主要類型是Map,這是一種Java聚集。而Cloneable接口則給出一個(gè)次要類型,這個(gè)類型說(shuō)明這個(gè)類的實(shí)例是可以安全克隆的。同樣,Serializable也是一個(gè)次要類型,它表明這個(gè)類的實(shí)例是可以串行化的。如下所示:DictionaryMapCloneableJava.io.SerializableJava.util.Hashtable一個(gè)例子:
賬號(hào),賬號(hào)的種類和賬號(hào)的狀態(tài)Account類有兩個(gè)聚合關(guān)系——均是靜態(tài)抽象類型,一個(gè)指向AccountType(該類型有Saving和Checking兩種具體子類),另一個(gè)指向AccountStatus(該類型有Open和OverDrawn兩種具體實(shí)現(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:具體實(shí)現(xiàn)類Saving源代碼publicclassSavingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代碼6:具體實(shí)現(xiàn)類Checking源代碼publicclassCheckingextendsAccountType{publicvoiddeposit(floatamt){//writeyourcodehere}}代碼7:具體實(shí)現(xiàn)類Open源代碼publicclassOpenextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}代碼8:具體實(shí)現(xiàn)類Overdrawn源代碼publicclassOverdrawnextendsAccountStatus{publicvoidsendCorrespondence(){//writeyourcodehere}}
在這個(gè)例子里,Account類依賴于AccountType和AccountStatus兩個(gè)抽象類型,而不是它們的子類型。AccountType有兩個(gè)子類型:儲(chǔ)蓄賬號(hào):以Saving具體類代表支票賬號(hào):以Checking具體類代表AccountStatus也有兩個(gè)子類型:可用狀態(tài):以O(shè)pen具體類代表超支狀態(tài):以O(shè)verdrawn具體類為代表Account類并不依賴于具體類,因此當(dāng)有新的具體類型添加到系統(tǒng)中時(shí),Account類不必改變。例如,如果系統(tǒng)引進(jìn)了一個(gè)新型的賬號(hào):MoneyMarket類型,Account類以及系統(tǒng)里面所有其他的依賴于AccountType抽象類的客戶端均不必改變。其源代碼如下:代碼9:具體實(shí)現(xiàn)類MoneyMarket源代碼public
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人才培養(yǎng)模式與核心建設(shè)方案
- 設(shè)備監(jiān)理合同-設(shè)備監(jiān)理合同管理模擬試卷3
- 安徽省肥東縣高級(jí)中學(xué)高三上學(xué)期8月調(diào)研考試語(yǔ)文試卷(含答案)
- 第二十七章腹股溝斜疝的臨床表現(xiàn)61課件講解
- 2025年健身比賽裁判合同
- 2025年嬰童用品代理合作協(xié)議
- 2025年農(nóng)業(yè)種植特許經(jīng)營(yíng)合同
- 2025年在線寵物服務(wù)平臺(tái)用戶注冊(cè)協(xié)議
- 2025年分期付款游戲軟件購(gòu)買(mǎi)協(xié)議
- 2025年保全抵押合同
- 銷售與銷售目標(biāo)管理制度
- 人教版(2025新版)七年級(jí)下冊(cè)英語(yǔ):寒假課內(nèi)預(yù)習(xí)重點(diǎn)知識(shí)默寫(xiě)練習(xí)
- 2024年食品行業(yè)員工勞動(dòng)合同標(biāo)準(zhǔn)文本
- 2024-2030年中國(guó)減肥行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資研究報(bào)告
- 運(yùn)動(dòng)技能學(xué)習(xí)
- 2024年中考英語(yǔ)專項(xiàng)復(fù)習(xí):傳統(tǒng)文化的魅力(閱讀理解+完型填空+書(shū)面表達(dá))(含答案)
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計(jì)規(guī)范
- 2024年公安部直屬事業(yè)單位招聘筆試參考題庫(kù)附帶答案詳解
- 臨沂正祥建材有限公司牛心官莊鐵礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 六年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題練習(xí)100題及答案
- 死亡報(bào)告年終分析報(bào)告
評(píng)論
0/150
提交評(píng)論