版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、面向?qū)ο笤O(shè)計方法 L06 B 可重用和可維護原則依賴倒換原則.wxz為何而“倒轉(zhuǎn)”n倒轉(zhuǎn)的意義:傳統(tǒng)的過程性系統(tǒng)的設(shè)計辦法傾向于使高層次的模塊依賴于低層次的模塊;抽象層次依賴于具體層次。倒轉(zhuǎn)原則就是要把這個錯誤的依賴關(guān)系倒轉(zhuǎn)過來,這就是“依賴倒轉(zhuǎn)原則”的來由。(抽象層次依賴于具體層次)為何而“倒轉(zhuǎn)”n抽象層次含有宏觀的和重要商務(wù)邏輯,是必然性的體現(xiàn),而具體層次是含有一些次要的與實現(xiàn)有關(guān)的算法和邏輯,帶有相當(dāng)大的偶然性選擇。復(fù)用與可維護性的“倒轉(zhuǎn)”n 從復(fù)用的角度來看,高層次的模塊是設(shè)計者應(yīng)當(dāng)復(fù)用的。但是傳統(tǒng)的過程性的設(shè)計中,復(fù)用卻側(cè)重于具體層次模塊的復(fù)用,比如算法復(fù)用,數(shù)據(jù)結(jié)構(gòu)復(fù)用,函數(shù)庫復(fù)用
2、等,都不可避免是具體層次模塊的復(fù)用。較高層次的結(jié)構(gòu)依賴于較低層次的結(jié)果,接下去不斷的循環(huán)直到依賴于每一行的代碼。較低層次的修改就會影響到較高層次的修改,直到高層次邏輯的修改n傳統(tǒng)的做法也強調(diào)具體層次上的可維護性,而不是高層次上的可維護性。n從復(fù)用的意義上來說,既然抽象層次含有一個應(yīng)用系統(tǒng)最重要的宏觀商務(wù)邏輯,是作戰(zhàn)略性判斷和決定的地方,那么抽象層次就應(yīng)當(dāng)是較為穩(wěn)定的,應(yīng)當(dāng)是復(fù)用的重點。由于現(xiàn)有的復(fù)用側(cè)重于具體模塊和細節(jié)的復(fù)用,因此,“倒轉(zhuǎn)”一詞是指復(fù)用應(yīng)當(dāng)將復(fù)用的重點放在抽象層次上。n最重要的宏觀商務(wù)邏輯也應(yīng)當(dāng)是維護重點n遵守依賴倒轉(zhuǎn)原則會帶來復(fù)用和可維護性的“倒轉(zhuǎn)”。依賴倒轉(zhuǎn)原則n三種耦合關(guān)
3、系1.零耦合:如果兩個類沒有耦合關(guān)系,就稱為零耦合。2.具體耦合:具體性耦合發(fā)生在兩個具體的(可實例化的)類之間,經(jīng)由一個類對另一個具體類的直接引用造成的。3.抽象耦合:抽象耦合關(guān)系發(fā)生在一個具體類和一個抽象類(或者Java接口)之間,使兩個必須發(fā)生聯(lián)系的類之間存有最大的靈活性。什么是依賴倒轉(zhuǎn)原則 簡單的說,DIP要求客戶端依賴于抽象耦合。依賴倒轉(zhuǎn)的表述是:抽象不應(yīng)當(dāng)依賴于細節(jié),細節(jié)應(yīng)當(dāng)依賴于抽象。 另一種表述是:要針對接口編程,不要針對實現(xiàn)編程。(要實現(xiàn),一個具體Java類應(yīng)當(dāng)只實現(xiàn)Java接口和抽象Java類中聲明過的方法,而不應(yīng)當(dāng)給出多余的方法)倒轉(zhuǎn)依賴關(guān)系強調(diào)一個系統(tǒng)內(nèi)的實體之間關(guān)系的
4、靈活性。變量的靜態(tài)類型和真實類型n 變量被聲明時的類型叫做變量的靜態(tài)類型,變量所引用的對象的真實類型叫做變量的實際類型。List employees=new Vector();上述代碼中,employees變量的靜態(tài)類型是List,而它實際類型是Vector。引用對象的抽象類型n在很多情況下,一個Java程序需要引用一個對象。如果這個對象有一個抽象類型的話,應(yīng)當(dāng)使用這個抽象類型作為變量的靜態(tài)類型。這就是針對接口編程的含義。n 如果“蛋”代表抽象,“雞”代表具體,那么,依賴倒轉(zhuǎn)原則相當(dāng)于在說,“雞”應(yīng)當(dāng)依賴于“蛋”,先有蛋,后有雞。n 如右圖所示,那么變量的聲明應(yīng)當(dāng)是:n 蛋 xnew 雞();
5、 蛋抽象類雞具體類例子:創(chuàng)建employee類n盡量不要使用:n Vector employees=new Vector();n應(yīng)當(dāng)使用:n List employees=new Vector();n區(qū)別:前者使用具體類作為變量的類型,而后者使用一個抽象類(List是Java接口)作為類型。n好處:在決定將Vector類型轉(zhuǎn)換成ArrayList時,需要改動的很少:n List employees=new ArrayList();引用對象的抽象類型的優(yōu)點n 程序具有更好的靈活性,因為除去調(diào)用構(gòu)造子的一行語句之外,程序的其余部分根本察覺不到變化。n 因此,只要一個被引用的對象存在抽象類型,就應(yīng)當(dāng)
6、在任何引用此對象的地方使用抽象類型,包括變量的類型聲明,方法返還類型的聲明,屬性變量類型的聲明等。對象的創(chuàng)建n 一般而言,在創(chuàng)建一個對象時,Java語言要求使用new關(guān)鍵詞以及這個類型本身。如上所示。n 一旦對象已經(jīng)被創(chuàng)建出來,那么就可以靈活的使用這個對象的抽象類型來引用它。n 因此,Java語言創(chuàng)建一個對象的過程是違背“開閉”原則以及依賴倒轉(zhuǎn)原則的。雖然在這個類被創(chuàng)建出來以后,可以通過多態(tài)性使得客戶端依賴于其抽象模型。n 正是由于這個原因,設(shè)計模式給出了多個創(chuàng)建模式,特別是工廠模式,用于解決對象創(chuàng)建過程中的依賴倒轉(zhuǎn)問題。怎樣做到依賴倒轉(zhuǎn)原則n 以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。 由于一個抽
7、象耦合關(guān)系總要涉及到具體類從抽象類繼承,并且保證在任何引用到基類的地方都可以轉(zhuǎn)換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。 抽象方式耦合局限:n 在某些情況下,如果一個具體類發(fā)生變化的可能性很小,那么抽象耦合能發(fā)揮的好處便十分有限,這時使用具體耦合反而會更好。n依賴倒轉(zhuǎn)原則是OO設(shè)計的核心原則,設(shè)計模式的研究和應(yīng)用是以依賴倒轉(zhuǎn)原則為指導(dǎo)原則的。下面就舉幾個設(shè)計模式的例子加以說明。工廠方法模式n針對問題: 應(yīng)當(dāng)使消費一個對象的客戶端只依賴于對象的抽象類型,而不是它的具體類型。但是,Java語言要求在將一個(具體)類實例化的時候,必須調(diào)用這個具體類的構(gòu)造子,所以Java語言給出的類的實例化
8、方法無法做到只依賴于抽象類型。n 簡單工廠模式將這個違反“開閉”原則以及依賴倒轉(zhuǎn)原則的做法封裝到一個類里。n 工廠方法模式是類的創(chuàng)建模式,又叫做虛擬構(gòu)造子模式或多態(tài)性工廠模式。它的用意是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中。n如下頁圖所示:高級商業(yè)邏輯抽象工廠具體產(chǎn)品具體工廠具體工廠抽象產(chǎn)品具體產(chǎn)品工廠方法模式的優(yōu)點:工廠方法模式的優(yōu)點:n 在工廠方法模式中,核心的工廠類不再負責(zé)所有的產(chǎn)品的創(chuàng)建,而是將創(chuàng)建的工作交給子類去做。這個核心類成為一個抽象工廠的角色,僅負責(zé)給出具體工廠子類必須實現(xiàn)的接口,而不接觸哪一個產(chǎn)品類實例化的細節(jié)。這使得工廠方法模式可以允許系統(tǒng)在不修改具體
9、工廠角色的情況下引進新的產(chǎn)品,使其具有超越簡單工廠模式的優(yōu)越性。模板方法模式n 模板方法模式準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。先制定一個頂級邏輯框架,而將邏輯的細節(jié)留給具體的子類去實現(xiàn)。 如下圖所示:高級商業(yè)邏輯抽象模板角色具體模板角色具體模板角色模板方法模式特點n 支持依賴倒轉(zhuǎn)原則。n 具體子類不能影響抽象類的宏觀邏輯,而抽象類的改變則會導(dǎo)致細節(jié)邏輯的改變。迭代子模式n 迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內(nèi)部表象。多個對象聚在
10、一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。n 迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。n 如下圖所示:Iterator是迭代器的意思,它的作用是一次產(chǎn)生一個數(shù)據(jù)項,直到?jīng)]有為止。高級商業(yè)邏輯Iterator接口Iterator的實現(xiàn)Iterator的實現(xiàn) 這樣一來,聚集的內(nèi)部結(jié)構(gòu)的改變就不會涉及到客戶端,從而實現(xiàn)對抽象接口的依賴。Java對抽象類型的支持 n Java語言提供了Java接口和Java抽象類實現(xiàn)對抽象類型的支持。二者區(qū)別 1 Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以2對于Java抽象
11、類,Java語言限制一個類只能從最多一個超類繼承;而Java接口,一個類可以實現(xiàn)任意多個Java接口3從代碼重構(gòu)的角度來講將一個單獨的Java具體類重構(gòu)成一個Java接口的實現(xiàn)是很容易的;而為一個已有的具體類添加一個Java抽象類卻不那么容易4 Java接口是定義混合類型(Mixin Type)的理想工具將一個單獨的Java具體類重構(gòu)成一個Java接口的實現(xiàn)n 只需要聲明一個Java接口,并將重要的方法添加到接口聲明中,然后在具體類定義語句后面加上一個合適的implements子句就可以了。為一個已有的具體類添加一個Java抽象類n 由于這個具體類有可能有一個超類,這樣一來,這個新定義的抽象類
12、只好繼續(xù)向上移動,變成這個超類的超類,如此循環(huán),最后這個新定義的抽象類必定處于整個類型等級結(jié)構(gòu)的最上端,從而使等級結(jié)構(gòu)中的所有成員都會受到影響。Java接口定義混合類型n 所謂混合類型,就是在一個類的主類型之外的次要類型。n 比如Hashtable類就有多個類型。它的主要類型是Map,這是一種Java聚集。而Cloneable接口則給出一個次要類型,這個類型說明這個類的實例是可以安全克隆的。同樣,Serializable也是一個次要類型,它表明這個類的實例是可以串行化的。n 如下所示:DictionaryMapCloneableJava.io.SerializableJava.util.Has
13、htable聯(lián)合使用Java抽象類和Java接口n 由于Java抽象類具有提供缺省實現(xiàn)的優(yōu)點,而Java接口具有其他所有的優(yōu)點,如下圖所示,所以聯(lián)合使用兩者就算一個很好的選擇。interface抽象類型缺省實現(xiàn)聯(lián)合使用的實現(xiàn)n 首先,聲明類型的工作仍然是由Java接口實現(xiàn)的,但是同時給出的還有一個Java抽象類,為這個接口給出一個缺省實現(xiàn)。其他同屬于這個抽象類型的具體類可以選擇實現(xiàn)這個Java接口,也可以選擇繼承自這個抽象類。聯(lián)合使用的實現(xiàn)(續(xù))n 如果一個具體類直接實現(xiàn)這個Java接口的話,它就必須自行實現(xiàn)所有的接口;相反,如果它繼承自抽象類的話,它可以省去一些不必要的方法,因為它可以從抽象
14、類中自動得到這些方法的缺省實現(xiàn)。n 如果需要向Java接口加入一個新的方法的話,那么只要同時向這個抽象類加入這個方法的一個具體實現(xiàn)就可以了,因為所有繼承自這個抽象類的子類都會從這個抽象類得到這個具體方法。這其實就是缺省適配模式。一個例子:賬號,賬號的種類和賬號的狀態(tài)n Account類有兩個聚類關(guān)系均是靜態(tài)抽象類型,一個指向AccountType(該類型有Saving和Checking兩種具體子類),另一個指向AccountStatus(該類型有Open和OverDrawn兩種具體實現(xiàn))。n 如下圖所示:Account+Account(accType:AccountType)+depoist(
15、amt:float)voidAccountStatus+sendCorrespondence():voidAccount+depoist(amt:float)voidSaving+depoist(amt:float)voidAccountType+depoist(amt:float)voidOverdrawn+sendCorrespondence():voidOpen+sendCorrespondence():void代碼2:Account類的源代碼nPublic class Accountnn private AccountType accountType;n private Account
16、Status accountStatus;n public Account(AccountType accType)n n /write your code heren n public void deposit(float amt)n n /write your code heren n代碼3:抽象類AccountType源代碼nabstract public class AccountTypenn public abstract void deposit(float amt);n代碼4:抽象類AccountStatus源代碼nabstract public class AccountSta
17、tusn public abstract voidsendCorrespondence();n代碼5:具體實現(xiàn)類Saving源代碼npublic class Saving extends AccountTypenn public void deposit(float amt)n n /write your code heren n代碼6:具體實現(xiàn)類Checking源代碼public class Checking extends AccountTypen public void deposit(float amt)n n /write your code heren 代碼7:具體實現(xiàn)類Open源
18、代碼npublic class Open extends AccountStatusnn public void sendCorrespondence()n n /write your code heren n代碼8:具體實現(xiàn)類Overdrawn源代碼public class Overdrawn extends AccountStatusn public void sendCorrespondence()n n /write your code heren n 為了創(chuàng)建一個實例,必須直接調(diào)用此具體類的構(gòu)造子類。n 如果需要將一個具體類替換成為另一個具體類,而不改變創(chuàng)建此實例的方法,只有一個辦法,那就是將創(chuàng)建責(zé)任下推給一個工廠類。n 在這個例子里,Account類依賴于AccountType和AccountStatus兩個抽象類型,而不是它們的子類型。 AccountType有兩個子類型:n 儲蓄賬號:以Saving具體類代表n 支票賬號:以Checking具體類代表nAccountStatus也有兩個子類型:n 開狀態(tài):以O(shè)pen具體類代表n 超支狀態(tài):以O(shè)verdrawn具體類為代表n Account類并不依賴于具體類,因此當(dāng)有新的具體類型添加到系統(tǒng)中時, Account類不必改變。n例如,如果系統(tǒng)引進了
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)軟裝方案設(shè)計與全球采購一體化協(xié)議版B版
- 專業(yè)項目融資策略咨詢服務(wù)協(xié)議典范版A版
- 「全面」樣本協(xié)議指南(2024修訂版)版B版
- 重點傳染病知識培訓(xùn)課件
- 2025年度廠房灰土施工與綠色建筑認證合同3篇
- 2025年度城市核心區(qū)拆遷房買賣合同書4篇
- 2025年度智能穿戴設(shè)備陳列展示與銷售合同范本4篇
- 2025年創(chuàng)新型廠房抵押擔(dān)保投資合同4篇
- 二零二五版打井空壓機租賃及風(fēng)險控制協(xié)議3篇
- 2024鋁單板生產(chǎn)設(shè)備采購與租賃合同
- 羊水少治療護理查房
- 中華人民共和國保守國家秘密法實施條例培訓(xùn)課件
- 管道坡口技術(shù)培訓(xùn)
- OQC培訓(xùn)資料教學(xué)課件
- 2024年8月CCAA國家注冊審核員OHSMS職業(yè)健康安全管理體系基礎(chǔ)知識考試題目含解析
- 體育賽事組織與實施操作手冊
- 2024年浙江省公務(wù)員考試結(jié)構(gòu)化面試真題試題試卷答案解析
- 2023年航空公司招聘:機場安檢員基礎(chǔ)知識試題(附答案)
- 皮膚儲存新技術(shù)及臨床應(yīng)用
- 《現(xiàn)在完成時》語法復(fù)習(xí)課件(共44張-)
- 二年級下冊語文《第3單元 口語交際:長大以后做什么》課件
評論
0/150
提交評論