




已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
軟 件 工 程 第21講:面向?qū)ο笤O(shè)計方法與法則,主講人:陽王東 Email:,主要內(nèi)容,優(yōu)先使用(對象)組合,而非(類)繼承 針對接口編程,而非(接口的)實現(xiàn) 類的封閉性原則 開放封閉法則(OCP) Liskov替換法則(LSP),優(yōu)先使用(對象)組合,而非(類)繼承,組合 繼承 示例分析 練習,組合的定義,定義 (對象)組合是一種通過創(chuàng)建一個組合了其它對象的對象,從而獲得新功能的復用方法。 將功能委托給所組合的一個對象,從而獲得新功能。 有些時候也稱之為“聚合”(aggregation)或“包容”(containment),盡管有些作者對這些術(shù)語賦予了專門的含義 兩種方式實現(xiàn) 根據(jù)引用(By reference) 根據(jù)值(By value),組合的優(yōu)點和缺點,優(yōu)點 容器類僅能通過被包含對象的接口來對其進行訪問。 “黑盒”復用,因為被包含對象的內(nèi)部細節(jié)對外是不可見。 對裝性好。 實現(xiàn)上的相互依賴性比較小。(譯者注:被包含對象與容器對象之間的依賴關(guān)系比較少) 每一個類只專注于一項任務(wù)。 通過獲取指向其它的具有相同類型的對象引用,可以在運行期間動態(tài)地定義(對象的)組合。 缺點 從而導致系統(tǒng)中的對象過多。 為了能將多個不同的對象作為組合塊(composition block)來使用,必須仔細地對接口進行定義。,繼承的特點,(類)繼承是一種通過擴展一個已有對象的實現(xiàn),從而獲得新功能的復用方法。 泛化類(超類)可以顯式地捕獲那些公共的屬性和方法。 特殊類(子類)則通過附加屬性和方法來進行實現(xiàn)的擴展。,繼承的優(yōu)點和缺點,優(yōu)點 容易進行新的實現(xiàn),因為其大多數(shù)可繼承而來。 易于修改或擴展那些被復用的實現(xiàn)。 缺點 破壞了封裝性,因為這會將父類的實現(xiàn)細節(jié)暴露給子類。 “白盒”復用,因為父類的內(nèi)部細節(jié)對于子類而言通常是可見的。 當父類的實現(xiàn)更改時,子類也不得不會隨之更改。 從父類繼承來的實現(xiàn)將不能在運行期間進行改變。,規(guī)則,僅當下列的所有標準被滿足時,方可使用繼承: 子類表達了“是一個的特殊類型”,而非“是一個由所扮演的角色”。 子類的一個實例永遠不需要轉(zhuǎn)化(transmute)為其它類的一個對象。 子類是對其父類的職責(responsibility)進行擴展,而非重寫或廢除(nullify)。 子類沒有對那些僅作為一個工具類(utility class)的功能進行擴展。 對于一個位于實際的問題域(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è)計 當然可以通過繼承,以擴充(enlarge)可用的組合類集(the set of composable classes)。 因此組合與繼承可以一起工作 但是我們的基本法則是: 優(yōu)先使用對象組合,而非(類)繼承,練習,設(shè)計下列類的關(guān)系 人、學生、教師 本科、研究生 大一學生、大二學生、大三學生、大四學生 講師、教授,針對接口編程,而非(接口的)實現(xiàn),接口的特征 實現(xiàn)繼承和接口繼承 接口的好處 示例分析 練習,接口的特征,接口是一個對象在對其它的對象進行調(diào)用時所知道的方法集合。 一個對象可以有多個接口(實際上,接口是對象所有方法的一個子集) 類型是對象的一個特定的接口。 不同的對象可以具有相同的類型,而且一個對象可以具有多個不同的類型。 一個對象僅能通過其接口才會被其它對象所了解。 某種意義上,接口是以一種非常局限的方式,將“是一種”表達為“一種支持該接口的”。 接口是實現(xiàn)插件化(pluggability)的關(guān)鍵 接口表示“像”(LikeA)的關(guān)系,繼承表示“是”(IsA)的關(guān)系,組合表示“有”(HasA)的關(guān)系。,實現(xiàn)繼承和接口繼承,實現(xiàn)繼承(類繼承):一個對象的實現(xiàn)是根據(jù)另一個對象的實現(xiàn)來定義的。 接口繼承(子類型化):描述了一個對象可在什么時候被用來替代另一個對象。 C+的繼承機制既指類繼承,又指接口繼承。 C+通過繼承純虛類來實現(xiàn)接口繼承。 Java對接口繼承具有單獨的語言構(gòu)造方式Java接口。 Java接口構(gòu)造方式更加易于表達和實現(xiàn)那些專注于對象接口的設(shè)計。,接口的好處,優(yōu)點 Client不必知道其使用對象的具體所屬類。 一個對象可以很容易地被(實現(xiàn)了相同接口的)的另一個對象所替換。 對象間的連接不必硬綁定(hardwire)到一個具體類的對象上,因此增加了靈活性。 松散藕合(loosens coupling)。 增加了重用的可能性。 提高了(對象)組合的機率,因為被包含對象可以是任何實現(xiàn)了一個指定接口的類。 缺點 設(shè)計的復雜性略有增加,接口定義,抽象的交通工具的定義,接口實現(xiàn),練習,畫圖類的設(shè)計 實現(xiàn)畫圖功能 可以畫線、圓、長方形、正方形、三角形等。,類的封閉性原則,完備性。一個類要完成一個獨立的業(yè)務(wù)過程,該類的內(nèi)部應(yīng)該定義了這個業(yè)務(wù)的整個過程,盡量不要在這個類定義了一些過程,而在另一個類中又定義了另外一些過程。 透明性。一個類要提供一項功能給其他的類復用,該項功能對其使用者是透明的,不但是在實現(xiàn)上是透明的,而且在使用上也是透明的。,封閉性原則在類繼承中運用,類的繼承形式 直接繼承父類的方法實現(xiàn)復用 調(diào)用父類的方法構(gòu)成自己的方法實現(xiàn)復用 通過抽象方法來實現(xiàn)邏輯關(guān)系的復用,直接繼承父類的方法實現(xiàn)復用,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)復用,public class Car public void go() /實現(xiàn)驅(qū)動功能代碼 roll();/調(diào)用父類的輪子滾動方法 Car bmw=new Car(); bmw.go();,最終調(diào)用者只需知道一個開動汽車的方法,子類中需要知道汽車開動的操作流程,通過抽象方法來實現(xiàn)邏輯關(guān)系的復用,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),開放-封閉法則認為我們應(yīng)該試圖去設(shè)計出永遠也不需要改變的模塊。 我們可以添加新代碼來擴展系統(tǒng)的行為。我們不能對已有的代碼進行修改。 符合OCP的模塊需滿足兩個標準: 可擴展,即“對擴展是開放的”(Open For Extension)模塊的行為可以被擴展,以需要滿足新的需求。 不可更改,即“對更改是封閉的”(Closed for Modification)模塊的源代碼是不允許進行改動的。,OCP示例,設(shè)計要求 Purchase類的calculate方法要求在制訂的部件數(shù)組中計算各個部件價格的總和。 部件有顯示器、CPU、內(nèi)存、主板、硬盤、光驅(qū)、機箱、鍵盤、鼠標等 初步設(shè)計 定義一個基類Part表示部件,所有具體部件都從Part繼承下來的子類 Part的定義為:,計算總價的實現(xiàn),但是在計算總價格時,若財務(wù)部頒布主板和內(nèi)存應(yīng)使用額外費用,改進方案1,子類重載父類的方法:每當計價策略發(fā)生改變,我們就修改Part的每個子類!,改進的方案2,采用一個PricePolicy類,通過對其進行繼承以提供不同的計價策略,改進部件類,練習,計算住房按揭
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡化流程房屋買賣合同協(xié)議書
- 湛江科技學院《化工原理實驗(二)》2023-2024學年第二學期期末試卷
- 南開中學初2025年初三練習題一(全國卷I)生物試題含解析
- 遼寧省大連市金普新區(qū)2025年小學六年級第二學期小升初數(shù)學試卷含解析
- 泉州輕工職業(yè)學院《國際貿(mào)易單證》2023-2024學年第二學期期末試卷
- 山東省菏澤市成武縣實驗小學2025屆四下數(shù)學期末綜合測試試題含解析
- 浙江省安慶市2025屆四下數(shù)學期末聯(lián)考模擬試題含解析
- 天津理工大學中環(huán)信息學院《影像核醫(yī)學與分子影像》2023-2024學年第二學期期末試卷
- 無錫工藝職業(yè)技術(shù)學院《UI及用戶體驗設(shè)計》2023-2024學年第二學期期末試卷
- 荊州學院《中國古代文學史一先秦兩漢文學》2023-2024學年第二學期期末試卷
- 經(jīng)腋窩無充氣完全腔鏡甲狀腺手術(shù)拉鉤
- 鎮(zhèn)江看守所施工組織設(shè)計方案(第三次)
- 灌溉與排水工程設(shè)計規(guī)范標準
- 醫(yī)院患者診療信息安全風險評估和應(yīng)急工作機制制定應(yīng)急預案XX醫(yī)院患者診療信息安全風險應(yīng)急預案
- 計算機科學與技術(shù)本科生畢業(yè)論文——基于Web的醫(yī)院預約掛號系統(tǒng)的設(shè)計與實現(xiàn)
- T∕AOPA 0018-2021 直升機臨時起降場選址與建設(shè)規(guī)范
- 高考英語高頻688詞匯(核心版本)
- 涪陵榨菜集團盈利能力分析工商管理專業(yè)
- 35kv配電系統(tǒng)繼電保護方案設(shè)計(共33頁)
- 中國收藏家協(xié)會個人會員入會申請表
- 醫(yī)院處方箋模板
評論
0/150
提交評論