已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
軟 件 工 程 第21講:面向?qū)ο笤O(shè)計方法與法則,主講人:陽王東 Email:,主要內(nèi)容,優(yōu)先使用(對象)組合,而非(類)繼承 針對接口編程,而非(接口的)實現(xiàn) 類的封閉性原則 開放封閉法則(OCP) Liskov替換法則(LSP),優(yōu)先使用(對象)組合,而非(類)繼承,組合 繼承 示例分析 練習(xí),組合的定義,定義 (對象)組合是一種通過創(chuàng)建一個組合了其它對象的對象,從而獲得新功能的復(fù)用方法。 將功能委托給所組合的一個對象,從而獲得新功能。 有些時候也稱之為“聚合”(aggregation)或“包容”(containment),盡管有些作者對這些術(shù)語賦予了專門的含義 兩種方式實現(xiàn) 根據(jù)引用(By reference) 根據(jù)值(By value),組合的優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn) 容器類僅能通過被包含對象的接口來對其進(jìn)行訪問。 “黑盒”復(fù)用,因為被包含對象的內(nèi)部細(xì)節(jié)對外是不可見。 對裝性好。 實現(xiàn)上的相互依賴性比較小。(譯者注:被包含對象與容器對象之間的依賴關(guān)系比較少) 每一個類只專注于一項任務(wù)。 通過獲取指向其它的具有相同類型的對象引用,可以在運(yùn)行期間動態(tài)地定義(對象的)組合。 缺點(diǎn) 從而導(dǎo)致系統(tǒng)中的對象過多。 為了能將多個不同的對象作為組合塊(composition block)來使用,必須仔細(xì)地對接口進(jìn)行定義。,繼承的特點(diǎn),(類)繼承是一種通過擴(kuò)展一個已有對象的實現(xiàn),從而獲得新功能的復(fù)用方法。 泛化類(超類)可以顯式地捕獲那些公共的屬性和方法。 特殊類(子類)則通過附加屬性和方法來進(jìn)行實現(xiàn)的擴(kuò)展。,繼承的優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn) 容易進(jìn)行新的實現(xiàn),因為其大多數(shù)可繼承而來。 易于修改或擴(kuò)展那些被復(fù)用的實現(xiàn)。 缺點(diǎn) 破壞了封裝性,因為這會將父類的實現(xiàn)細(xì)節(jié)暴露給子類。 “白盒”復(fù)用,因為父類的內(nèi)部細(xì)節(jié)對于子類而言通常是可見的。 當(dāng)父類的實現(xiàn)更改時,子類也不得不會隨之更改。 從父類繼承來的實現(xiàn)將不能在運(yùn)行期間進(jìn)行改變。,規(guī)則,僅當(dāng)下列的所有標(biāo)準(zhǔn)被滿足時,方可使用繼承: 子類表達(dá)了“是一個的特殊類型”,而非“是一個由所扮演的角色”。 子類的一個實例永遠(yuǎn)不需要轉(zhuǎn)化(transmute)為其它類的一個對象。 子類是對其父類的職責(zé)(responsibility)進(jìn)行擴(kuò)展,而非重寫或廢除(nullify)。 子類沒有對那些僅作為一個工具類(utility class)的功能進(jìn)行擴(kuò)展。 對于一個位于實際的問題域(Problem Domain)的類而言,其子類特指一種角色(role),交易(transaction)或設(shè)備(device)。,示例分析,火車票售票系統(tǒng) 乘客是人所扮演的一種角色。代理人亦然。 隨著時間的發(fā)展,一個Person的子類實例可能會從Passenger轉(zhuǎn)變成Agent,再到Agent Passenger。,組合設(shè)計1,組合設(shè)計2,總結(jié),組合與繼承都是重要的重用方法 在OO開發(fā)的早期,繼承被過度地使用 隨著時間的發(fā)展,我們發(fā)現(xiàn)優(yōu)先使用組合可以獲得重用性與簡單性更佳的設(shè)計 當(dāng)然可以通過繼承,以擴(kuò)充(enlarge)可用的組合類集(the set of composable classes)。 因此組合與繼承可以一起工作 但是我們的基本法則是: 優(yōu)先使用對象組合,而非(類)繼承,練習(xí),設(shè)計下列類的關(guān)系 人、學(xué)生、教師 本科、研究生 大一學(xué)生、大二學(xué)生、大三學(xué)生、大四學(xué)生 講師、教授,針對接口編程,而非(接口的)實現(xiàn),接口的特征 實現(xiàn)繼承和接口繼承 接口的好處 示例分析 練習(xí),接口的特征,接口是一個對象在對其它的對象進(jìn)行調(diào)用時所知道的方法集合。 一個對象可以有多個接口(實際上,接口是對象所有方法的一個子集) 類型是對象的一個特定的接口。 不同的對象可以具有相同的類型,而且一個對象可以具有多個不同的類型。 一個對象僅能通過其接口才會被其它對象所了解。 某種意義上,接口是以一種非常局限的方式,將“是一種”表達(dá)為“一種支持該接口的”。 接口是實現(xiàn)插件化(pluggability)的關(guān)鍵 接口表示“像”(LikeA)的關(guān)系,繼承表示“是”(IsA)的關(guān)系,組合表示“有”(HasA)的關(guān)系。,實現(xiàn)繼承和接口繼承,實現(xiàn)繼承(類繼承):一個對象的實現(xiàn)是根據(jù)另一個對象的實現(xiàn)來定義的。 接口繼承(子類型化):描述了一個對象可在什么時候被用來替代另一個對象。 C+的繼承機(jī)制既指類繼承,又指接口繼承。 C+通過繼承純虛類來實現(xiàn)接口繼承。 Java對接口繼承具有單獨(dú)的語言構(gòu)造方式Java接口。 Java接口構(gòu)造方式更加易于表達(dá)和實現(xiàn)那些專注于對象接口的設(shè)計。,接口的好處,優(yōu)點(diǎn) Client不必知道其使用對象的具體所屬類。 一個對象可以很容易地被(實現(xiàn)了相同接口的)的另一個對象所替換。 對象間的連接不必硬綁定(hardwire)到一個具體類的對象上,因此增加了靈活性。 松散藕合(loosens coupling)。 增加了重用的可能性。 提高了(對象)組合的機(jī)率,因為被包含對象可以是任何實現(xiàn)了一個指定接口的類。 缺點(diǎn) 設(shè)計的復(fù)雜性略有增加,接口定義,抽象的交通工具的定義,接口實現(xiàn),練習(xí),畫圖類的設(shè)計 實現(xiàn)畫圖功能 可以畫線、圓、長方形、正方形、三角形等。,類的封閉性原則,完備性。一個類要完成一個獨(dú)立的業(yè)務(wù)過程,該類的內(nèi)部應(yīng)該定義了這個業(yè)務(wù)的整個過程,盡量不要在這個類定義了一些過程,而在另一個類中又定義了另外一些過程。 透明性。一個類要提供一項功能給其他的類復(fù)用,該項功能對其使用者是透明的,不但是在實現(xiàn)上是透明的,而且在使用上也是透明的。,封閉性原則在類繼承中運(yùn)用,類的繼承形式 直接繼承父類的方法實現(xiàn)復(fù)用 調(diào)用父類的方法構(gòu)成自己的方法實現(xiàn)復(fù)用 通過抽象方法來實現(xiàn)邏輯關(guān)系的復(fù)用,直接繼承父類的方法實現(xiàn)復(fù)用,public class Vechile protected void roll() /滾動的實現(xiàn)代碼 public class Car extends Vechile public void driver() Car bmw=new Car(); bmw.driver(); bmw.roll();,最終調(diào)用者需要知道開動汽車的所有操作方法,調(diào)用父類的方法構(gòu)成自己的方法實現(xiàn)復(fù)用,public class Car public void go() /實現(xiàn)驅(qū)動功能代碼 roll();/調(diào)用父類的輪子滾動方法 Car bmw=new Car(); bmw.go();,最終調(diào)用者只需知道一個開動汽車的方法,子類中需要知道汽車開動的操作流程,通過抽象方法來實現(xiàn)邏輯關(guān)系的復(fù)用,public class abstract Vechile private void roll /實現(xiàn)滾動功能 /抽象的驅(qū)動方法 protected abstract void drive(); /車輛的行駛邏輯方法 public void go() /驅(qū)動 drive(); /滾動 roll(); ,汽車的開動過程在這里完全定義,符合完備性原則,public class Car extends Vechile /實現(xiàn)父類的抽象的驅(qū)動方法 public void drive() /具體特有的驅(qū)動功能代碼 Vechile vechiletest = new Car(); /調(diào)用車輛行駛功能 vechiletest.go();,子類只需要做自己的驅(qū)動就行了,開放封閉法則(OCP),開放-封閉法則認(rèn)為我們應(yīng)該試圖去設(shè)計出永遠(yuǎn)也不需要改變的模塊。 我們可以添加新代碼來擴(kuò)展系統(tǒng)的行為。我們不能對已有的代碼進(jìn)行修改。 符合OCP的模塊需滿足兩個標(biāo)準(zhǔn): 可擴(kuò)展,即“對擴(kuò)展是開放的”(Open For Extension)模塊的行為可以被擴(kuò)展,以需要滿足新的需求。 不可更改,即“對更改是封閉的”(Closed for Modification)模塊的源代碼是不允許進(jìn)行改動的。,OCP示例,設(shè)計要求 Purchase類的calculate方法要求在制訂的部件數(shù)組中計算各個部件價格的總和。 部件有顯示器、CPU、內(nèi)存、主板、硬盤、光驅(qū)、機(jī)箱、鍵盤、鼠標(biāo)等 初步設(shè)計 定義一個基類Part表示部件,所有具體部件都從Part繼承下來的子類 Part的定義為:,計算總價的實現(xiàn),但是在計算總價格時,若財務(wù)部頒布主板和內(nèi)存應(yīng)使用額外費(fèi)用,改進(jìn)方案1,子類重載父類的方法:每當(dāng)計價策略發(fā)生改變,我們就修改Part的每個子類!,改進(jìn)的方案2,采用一個PricePolicy類,通過對其進(jìn)行繼承以提供不同的計價策略,改進(jìn)部件類,練習(xí),計算住房按揭
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度模特時尚產(chǎn)業(yè)模特聘用合同-@-12
- 二零二五年度出租車公司股權(quán)轉(zhuǎn)讓與綠色出行推廣協(xié)議4篇
- 上海車位購買協(xié)議范本(2024版)版B版
- 二零二五版廢舊設(shè)備買賣及環(huán)境評估協(xié)議3篇
- 二零二五年度食堂承包與營養(yǎng)搭配服務(wù)合同3篇
- 2025年生物科技企業(yè)部分股權(quán)增資擴(kuò)股合同3篇
- 2025年鮮羊奶行業(yè)新型經(jīng)銷商合作模式合同范本3篇
- 二零二五年度原創(chuàng)動漫角色形象知識產(chǎn)權(quán)歸屬協(xié)議下載2篇
- 二零二五年空壓機(jī)設(shè)備銷售與安裝驗收合同2篇
- 2025年度高速公路服務(wù)區(qū)智能停車場車位租用合同范本
- 青島版二年級下冊三位數(shù)加減三位數(shù)豎式計算題200道及答案
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識課件
- 干部職級晉升積分制管理辦法
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預(yù)算實例:清單與計價樣本
- VOC廢氣治理工程中電化學(xué)氧化技術(shù)的研究與應(yīng)用
- 煤礦機(jī)電設(shè)備培訓(xùn)課件
- 高考寫作指導(dǎo)議論文標(biāo)準(zhǔn)語段寫作課件32張
評論
0/150
提交評論