




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο蟮脑O(shè)計原則-2-從問題開始!長方形與正方形假如我們有一個類:長方形(Rectangle)我們需要一個新的類,正方形(Square)問:可否直接繼承長方形?沒問題,因為數(shù)學(xué)上正方形就是長方形的子類!-3-開始設(shè)計:正方形public class Rectangle private int width; private int height; public void setWidth(int w) width = w; public int getWidth() return width; public void setHeight(int h) height = h; public in
2、t getHeight() return height; public class Square extends Rectangle public void setWidth(int w) super.setWidth (w); super.setHeight (w); public void setHeight(int h) super.setWidth (h); super.setHeight (h) ; -4-設(shè)計方案正確嗎?public static void resize(Rectangle r) while (r.getHeight() = r.getWidth() r.setHe
3、ight(r.getHeight() + 1); System.out.println(“Its OK.); Rectangle r1 = new Rectangle();r1.setHeight(5);r1.setWidth(15);resize(r1);Rectangle r2 = new Square();r2.setHeight(5);r2.setWidth(15);resize(r2);使用父類(長方形)時,程序正常運(yùn)行使用子類(正方形)時,程序陷入死循環(huán)設(shè)計出問題了?繼承出問題了?-5-為什么會出現(xiàn)問題?違背了面向?qū)ο蟮脑O(shè)計原則!-6-面向?qū)ο蟮脑O(shè)計原則什么是面向?qū)ο笤O(shè)計原則?面向
4、對象設(shè)計原則有什么意義?是指導(dǎo)面向?qū)ο笤O(shè)計的基本指導(dǎo)思想是評價面向?qū)ο笤O(shè)計的價值觀體系是設(shè)計模式的出發(fā)點和歸宿-7-設(shè)計目標(biāo)設(shè)計目標(biāo)可擴(kuò)展性 (Extensibility)靈活性 (Flexibility)可插入性 (Pluggability)-8-設(shè)計質(zhì)量:好的設(shè)計什么是好的設(shè)計?容易理解容易修改和擴(kuò)展容易復(fù)用容易實現(xiàn)與應(yīng)用簡單、緊湊、經(jīng)濟(jì)適用讓人工作起來心情愉快的設(shè)計-9-設(shè)計質(zhì)量:壞的設(shè)計什么是壞的設(shè)計?僵化性(Rigidity):剛性,難以修改,牽一發(fā)而動全身脆弱性(Fragility):易碎,牽一發(fā)而肝膽俱裂牢固性(Immobility):無法分解成可移植的組件粘滯性(Viscosi
5、ty),修改設(shè)計代價高昂不必要的復(fù)雜性(Needless Repetition)晦澀性(Opacity):不透明,很難看清設(shè)計者的真實意圖-10-設(shè)計質(zhì)量:培養(yǎng)靈敏的嗅覺糟糕的設(shè)計總是散發(fā)出臭味,讓人不悅。判斷一個設(shè)計的好壞,主觀上能否讓你的合作方感到心情愉悅,是最直觀的標(biāo)準(zhǔn)設(shè)計開發(fā)人員要培養(yǎng)嗅覺,當(dāng)你看到UML圖或者代碼,感到雜亂、繁瑣、郁悶的時候,你可能正面對一個糟糕的設(shè)計這種嗅覺是在實踐開發(fā)中培養(yǎng)起來的,而面向?qū)ο笤O(shè)計原則對此加以歸納和總結(jié)-11-面向?qū)ο蟮幕驹O(shè)計原則LSP:Liskov替換原則The Liskov Substitution PrincipleOCP:開放-封閉原則Th
6、e Open-Close PrincipleSRP:單一職責(zé)原則The Single Responsibility PrincipleISP:接口隔離原則The Interface Segregation Principle DIP:依賴倒置原則The Dependency Inversion Principle-12-LSPLSP(The Liskov Substitution Principle, Liskov替換原則) “若對于類型S的任一對象o1,均有類型T的對象o2存在,使得在T定義的所有程序P中,用o1替換o2之后,程序的行為不變,則S是T的子類型”如果在任何情況下,子類(或子類型
7、)或?qū)崿F(xiàn)類與基類都是可以互換的,那么繼承的使用就是合適的。為了達(dá)到這一目標(biāo),子類不能添加任何父類沒有的附加約束“子類對象必須可以替換基類對象”-13-違背LSP原則Square類針對height、width添加了Rectangle所沒有的附加的約束(即要求height=width),這樣Square類(子類)不能完全替換Rectangle(父類)違背了LSP原則帶來潛在的設(shè)計問題(使用resize方法時,子類出錯!)-14-怎么辦?在可能的情況下,由抽象類(接口)繼承-15-抽象類與具體類只要有可能,不要從具體類繼承。行為集中的方向是向上的(抽象類)數(shù)據(jù)集中的方向是向下的(具體類)-16-解決
8、方案-17-IS-A關(guān)系的思考?鴕鳥是鳥嗎?是鴕鳥有翅膀,鳥也有翅膀鴕鳥有喙,鳥也有喙但是鳥.getFlySpeed()鴕鳥.getRunSpeed()有著不同-18-IS-A關(guān)系的思考(續(xù))對于動物學(xué)家只關(guān)心鳥的生理特征,對他們來說,鴕鳥就是鳥 對于養(yǎng)鳥人關(guān)心鳥的行為特征,鴕鳥不是鳥 他們都正確考慮一個特定設(shè)計是否恰當(dāng)時,不能完全孤立地看這個解決方案,應(yīng)該根據(jù)設(shè)計的使用者提出的合理假設(shè)來審視-19-OCPOCP(The Open-Close Principle, 開放-封閉原則)軟件實體(類、模塊、函數(shù)等)應(yīng)該是可擴(kuò)展的,但是不可修改的特征:對于擴(kuò)展是開放的(Open for extensi
9、on)模塊的行為可以擴(kuò)展,當(dāng)應(yīng)用的需求改變時,可以對模塊進(jìn)行擴(kuò)展,以滿足新的需求對于更改是封閉的(Closed for modification)對模塊行為擴(kuò)展時,不必改動模塊的源代碼或二進(jìn)制代碼-20-OCP的關(guān)鍵在于抽象OCP的關(guān)鍵在于抽象抽象技術(shù):abstract class, Interface抽象預(yù)見了可能的所有擴(kuò)展(閉)由抽象可以隨時導(dǎo)出新的類(開)-21-范例:手與門如何在程序中模擬用手去開門和關(guān)門?行為:開門(open)關(guān)門(close)判斷門的狀態(tài)(isOpened)-22-設(shè)計實現(xiàn)public class Door private boolean _isOpen=false
10、; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class Hand public Door door; void do() if (door.isOpen() door.close(); else door.open(); public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHa
11、nd.door = new Door(); myHand.do(); -23-新的需求需要手去開關(guān)抽屜,冰箱?我們只好去修改程序!-24-解決新的需求:修改設(shè)計public class Hand public Door door; public Drawer drawer; void do(int item) switch (item) case 1: if (door.isOpen() door.close(); else door.open(); break;case 2: if (drawer.isOpen() drawer.close(); else drawer.open(); br
12、eak; public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.door = new Door(); myHand.do(1); 手被改了!主(使用手)程序也被改了!-25-符合OCP的設(shè)計方案public interface Excutable public boolean isOpen(); public void open(); public void close();-26-新的實現(xiàn)public class Door implements Excutabl
13、e private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class Hand public Excutable item; void do() if (item.isOpen() item.close(); else item.open(); public class Drawer implements Excutable private boo
14、lean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.item = new Door(); myHand.do(); -27-public class Refrigerator implements
15、Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; 新的需求需要手去開關(guān)冰箱?為冰箱實現(xiàn)Excutable接口不需要修改任何原有的設(shè)計和代碼-28-關(guān)于OCPOCP是OOD中很多說法的核心如果這個原則應(yīng)用得有效,應(yīng)用程序就會具有更多的可維護(hù)性、可重用性以及可健壯性LSP是OCP成為可能的主要原則之一正是子類型的可替換性才使得使用基類類型的模
16、塊在無需修改的情況下就可以擴(kuò)展-29-SRPSRP(The Single Responsibility Principle, 單一職責(zé)原則)就一個類而言,應(yīng)該僅有一個引起它變化的原因有關(guān)類的職責(zé)分配問題,是面向?qū)ο笤O(shè)計中最重要的基本原則“A critical, fundamental ability in OOA/D is to skillfully assign responsibility to software components.” Craig Larman-30-SRP本質(zhì)SRP體現(xiàn)了內(nèi)聚性(Cohesion)內(nèi)聚性:一個模塊的組成元素之間的功能相關(guān)性類的職責(zé)定義為“變化的原因”,
17、每個職責(zé)都是變化的一個軸線;當(dāng)需求變化時,該變化會反映為類的職責(zé)的變化如果一個類承擔(dān)了多于一個的職責(zé),那么引起它變化的原因就會有多個-31-違反SRP的案例Rectangle類可能會因為兩方面的原因而變化:計算幾何方面的原因和用戶界面設(shè)計方面的原因。其中只一發(fā)生變化之后,必須修改Rectangle類,而這種修改則可能導(dǎo)致另一個應(yīng)用程序出錯除此之外,違反SRP還會帶來物理依賴的缺點。-32-解決方案增加新的類,使得每個類僅有一個職責(zé)-33-ISPISP( The Interface Segregation Principle,接口隔離原則)客戶不應(yīng)該依賴他們不用到的方法,只給每個客戶它所需要的接口為了避免“肥接口(fat interface)”,應(yīng)當(dāng)以一個類實現(xiàn)多個接口,而各客戶僅僅獲知必須的接口-34-接口污染需求:一扇能超時報警的門DoorOpen()Close()Timeout()當(dāng)需要其它的門時習(xí)慣性從Door中繼承問題在哪兒?所有的門都擁有timeout接口,即便它不需要-35-解決方案:分離接口使用委托分離接口Adapter模式使用多重繼承分離接口-36-ISP本質(zhì)使用多個
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)科護(hù)理循環(huán)+泌尿系統(tǒng)鞏固試題
- 流動人口協(xié)管員工作總結(jié)
- 內(nèi)丘縣“醫(yī)院感染管理基層行”活動實施方案
- 2025年四川省愛眾能源工程有限公司對外招聘考試筆試試題(含答案)
- 2025年安全生產(chǎn)個人述職報告范本(三)
- 體育產(chǎn)業(yè)廠房轉(zhuǎn)租及賽事運(yùn)營合同
- 美食廣場餐飲托管服務(wù)合同樣本
- 高速鐵路沿線廠房拆遷補(bǔ)償及搬遷合同
- 車間租賃及智能化生產(chǎn)系統(tǒng)建設(shè)協(xié)議
- 銀行承兌匯票財務(wù)擔(dān)保合同賬務(wù)處理規(guī)定
- 天津大學(xué)年《物理化學(xué)》期末試題及答案
- 2022年脫硝試題庫
- DB37∕T 5016-2021 民用建筑外窗工程技術(shù)標(biāo)準(zhǔn)
- 全國202X年4月自學(xué)考試公文寫作與處理試題和答案解析.doc
- 杜邦安全理念課件
- 《房屋面積測算技術(shù)規(guī)程》DGJ32TJ131-2011
- 管道無損檢測施工專項方案
- 先進(jìn)集體申報表
- 酒店工程部考核表
- 工程塑料 第六章聚甲醛
- 模切設(shè)備日常點檢表
評論
0/150
提交評論