




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、12/16/20211n提高面向?qū)ο笤O(shè)計(jì)復(fù)用性的設(shè)計(jì)原則面向?qū)ο蟮脑O(shè)計(jì)原則12/16/20212設(shè)計(jì)目標(biāo)n可擴(kuò)展性(Extensibility):新功能易加入系統(tǒng)。n靈活性(Flexibility):允許代碼修改平穩(wěn)發(fā)生,不會(huì)涉及很多其他模塊。n可插入性(Pluggability):容易將一個(gè)類(lèi)換為另一個(gè)具有同樣接口的類(lèi)。12/16/20213軟件復(fù)用重要性n較高的生產(chǎn)率n較高的軟件質(zhì)量n恰當(dāng)使用復(fù)用,可改善系統(tǒng)的可維護(hù)性12/16/20214n使一個(gè)系統(tǒng)可在更高的層次上提供了可復(fù)用性n抽象化和繼承:使概念和定義可復(fù)用n多態(tài):使實(shí)現(xiàn)和應(yīng)用可復(fù)用n抽象化和封裝:可保持和促進(jìn)系統(tǒng)的可維護(hù)性面向?qū)ο?/p>
2、設(shè)計(jì)12/16/20215n抽象層次是一個(gè)應(yīng)用系統(tǒng)作戰(zhàn)略性判斷和決定的地方,那么抽象層次就應(yīng)當(dāng)是較為穩(wěn)定的,應(yīng)當(dāng)是復(fù)用的重點(diǎn)。n復(fù)用的焦點(diǎn)不再集中在函數(shù)和算法等具體實(shí)現(xiàn)細(xì)節(jié)上,而是集中在最重要的含有宏觀商業(yè)邏輯的抽象層次上。n既然如果抽象層次的模塊相對(duì)獨(dú)立于具體層次的模塊的話,那么具體層次內(nèi)部的變化就不會(huì)影響到抽象層次的結(jié)構(gòu),所以抽象層次的復(fù)用就會(huì)較為容易。復(fù)用12/16/20216n面向?qū)ο笤O(shè)計(jì)中,可維護(hù)性復(fù)用是以設(shè)計(jì)原則和設(shè)計(jì)模式為基礎(chǔ)的。面向?qū)ο髲?fù)用12/16/202171.開(kāi)閉原則OCP:Open-Closed Principle2. 里氏替換原則LSP:Liskov Substitu
3、tion Principle3. 依賴(lài)倒轉(zhuǎn)原則DIP:Dependency Inversion Principle4. 接口隔離原則ISP:Interface Segregation Principle5. 組合復(fù)用原則CRP:Compositoin Resuse Principle6. 迪米特法則LoD:Law of Demeter7.單一職責(zé)原則(SRP)面向?qū)ο笤O(shè)計(jì)原則12/16/20218n軟件組成實(shí)體應(yīng)該是對(duì)擴(kuò)展可擴(kuò)展的,但是對(duì)修改是關(guān)閉的。( Software Entities Should Be Open For Extension, But Closed For Modific
4、ation)1.開(kāi)-閉原則OCP12/16/20219n開(kāi)放-封閉法則認(rèn)為應(yīng)該試圖去設(shè)計(jì)出永遠(yuǎn)也不需要改變的模塊。n關(guān)鍵在于抽象化:可給系統(tǒng)定義一個(gè)一勞永逸,不再更改的抽象設(shè)計(jì),此設(shè)計(jì)允許有無(wú)窮無(wú)盡的行為在實(shí)現(xiàn)層被實(shí)現(xiàn)。抽象層預(yù)見(jiàn)所有擴(kuò)展。nPC外設(shè)開(kāi)-閉原則12/16/202110n一個(gè)軟件系統(tǒng)的所有模塊不可能都滿(mǎn)足OCP,但是應(yīng)該努力最小化這些不滿(mǎn)足OCP的模塊數(shù)量。 開(kāi)-閉原則12/16/202111Public class Part private double basePrice; public void setPrice(double price) basePrice = pric
5、e; public double getPrice() return basePrice; OCP例-類(lèi)12/16/202112Public double totalprice(Part parts) double total=0.0; for (int i=0;iparts.length;i+) total += partsi.getPrice(); return total;OCP例-某類(lèi)方法12/16/202113n內(nèi)存折扣?思考12/16/202114Public double totalprice(Part parts) double total=0.0; for (int i=0;
6、iparts.length;i+) if(partsI instanceof Memory) total += partsi.getPrice() * 0.9; else total += partsi.getPrice(); return total;方法12/16/202115n符合OCP嗎?思考12/16/202116Public class Memory extends Part public double getPrice() return basePrice * 0.9; 方法?12/16/202117n采用一個(gè)PricePolicy類(lèi),通過(guò)對(duì)其進(jìn)行繼承以提供不同的計(jì)價(jià)策略更好的方
7、法?12/16/202118Public class Part private PricePolicy pricePolicy; public void setPricePolicy(PricePolicy policy) pricePolicy = policy; public void setPrice(double price) pricePolicy.setPrice( price ); public double getPrice() return pricePolicy.getPrice(); 方法12/16/202119Public class PricePolicy priva
8、te double basePrice; public void setPrice(double price) basePrice = price; public double getPrice() return basePrice; 價(jià)格策略12/16/202120Public class Sale extends PricePolicy private double discount; public void setDiscount(double discount) this.discount = discount; public double getPrice() return base
9、Price * discount; 銷(xiāo)售策略12/16/202121n符合OCP了嗎?思考12/16/202122應(yīng)用實(shí)例w我們有一個(gè)需要在標(biāo)準(zhǔn)的GUI上繪制園和正方形的應(yīng)用程序。圓和正方形必須要按照特定的順序繪制。我們將創(chuàng)建一個(gè)列表,列表由按照適當(dāng)?shù)捻樞蚺帕械膱A和正方形組成,程序遍歷該列表,一次繪制出每個(gè)圓和正方形。12/16/202123w先考慮違反OCP的過(guò)程化方法n定義一個(gè)DrawAllShapes函數(shù)使用SWITCH來(lái)分支繪制圖形w為什么不符合OCP?n因?yàn)樗鼘?duì)于新的形狀類(lèi)型的添加不是封閉的n每增加一種新的形狀類(lèi)型,都必須要更改這個(gè)函數(shù)12/16/202124這樣的設(shè)計(jì)糟糕在哪里?w
10、增加形狀會(huì)導(dǎo)致所有的程序、變量重新編譯和部署w想在另一個(gè)程序中復(fù)用DrawAllShape這個(gè)函數(shù)時(shí),都必須要附帶上Square和Circle,即使那個(gè)程序不需要它們。12/16/202125怎樣遵循OCPw編寫(xiě)一個(gè)shape抽象類(lèi)w這個(gè)類(lèi)僅有一個(gè)抽象方法draw()w所有形狀都從這個(gè)類(lèi)派生w當(dāng)繪制一種新的形狀,只需要增加一個(gè)新的shape類(lèi)的派生類(lèi)。而DrawAllShapes 函數(shù)并不需要改變。12/16/202126n使用指向基類(lèi)(超類(lèi))的引用的函數(shù),必須能夠在不知道具體派生類(lèi)(子類(lèi))對(duì)象類(lèi)型的情況下使用它們。(Functions That Use Pointers of Referen
11、ces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It)2.里氏替換法則12/16/202127Public class Rectangle private double width; private double heigth; public Rectangle(double w,double h) width = w; heigth = h; public void setWidth(double w) width = w; public void s
12、etHeigth(double h) height = h; public double getWidth() return width; public double getHeigth() return height; public double area() return width * height; LSP例-矩形類(lèi)12/16/202128n正方形類(lèi) Squaren正方形是矩形,因此Square類(lèi)應(yīng)該從Rectangle類(lèi)派生而來(lái)。思考12/16/202129Public class Square extends Rectangle public Square(double s) su
13、per(s,s); public void setWidth(double w) super.setWidth ( w ); super.setHeight( w ); public void setHeight(double h) super.setWidth ( h ); super.setHeight( h ); 正方形類(lèi)12/16/202130Public class TestRectangle public static void testLSP(Rectangle r) r.setWidth(4.0); r.setHeight(5.0); System.out.println(“W
14、idth is 4.0 and Height is 5.0 ,Area is ” + r.area(); 測(cè)試類(lèi)12/16/202131public static void main(String args) Rectangle r=new Rectangle(1.0,1.0); Square s = new Square(1.0); testLSP ( r ); testLSP ( s ); 測(cè)試12/16/202132n編寫(xiě)testLsp()方法的程序員做了一個(gè)合理的假設(shè),即改變Rectangle的寬而保持它的高不變。n一個(gè)數(shù)學(xué)意義上的正方形可能是一個(gè)矩形,但是一個(gè)Square對(duì)象不是一個(gè)
15、Rectangle對(duì)象,因?yàn)橐粋€(gè)Square對(duì)象的行為與一個(gè)Rectangle對(duì)象的行為是不一致的!n從行為上來(lái)說(shuō),一個(gè)Square不是一個(gè)Rectangle!一個(gè)Square對(duì)象與一個(gè)Rectangle對(duì)象之間不具有多態(tài)的特征。問(wèn)題12/16/202133nLiskov替換法則(LSP)清楚地表明了ISA關(guān)系全部都是與行為有關(guān)的。n為了保持LSP,所有子類(lèi)必須符合使用基類(lèi)的client所期望的行為。n一個(gè)子類(lèi)型不得具有比基類(lèi)型更多的限制,可能這對(duì)于基類(lèi)型來(lái)說(shuō)是合法的,但是可能會(huì)因?yàn)檫`背子類(lèi)型的其中一個(gè)額外限制,從而違背了LSP!nLSP保證一個(gè)子類(lèi)總是能夠被用在其基類(lèi)可以出現(xiàn)的地方小結(jié)12/
16、16/202134n抽象不應(yīng)當(dāng)依賴(lài)于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴(lài)于抽象。n(Abstations should not depend upon details, Details should depend upon abstractions)3.依賴(lài)倒轉(zhuǎn)原則12/16/202135n針對(duì)接口編程,而非實(shí)現(xiàn)nProgram To An Interface, Not An ImplementationDIP12/16/2021361.Client不必知道其使用對(duì)象的具體所屬類(lèi)。2.一個(gè)對(duì)象可以很容易地被(實(shí)現(xiàn)了相同接口的)的另一個(gè)對(duì)象所替換。3.對(duì)象間的連接不必硬綁定(hardwire)到一個(gè)具體類(lèi)的對(duì)象上
17、,因此增加了靈活性。4.松散藕合(loosens coupling)。5.增加了重用的可能性。6.提高了(對(duì)象)組合的機(jī)率,因?yàn)楸话瑢?duì)象可以是任何實(shí)現(xiàn)了一個(gè)指定接口的類(lèi)。 使用接口的優(yōu)點(diǎn)12/16/202137n不將變量聲明為某個(gè)特定的具體類(lèi)的實(shí)例對(duì)象,而讓其遵從抽象類(lèi)定義的接口。實(shí)現(xiàn)類(lèi)僅實(shí)現(xiàn)接口,不添加方法。n(Draw(shape*p) 不要Cricle*p Rectangle *p Triangle *p)針對(duì)接口編程12/16/202138n任何變量都不應(yīng)該持有一個(gè)指向具體類(lèi)的指針或引用n任何類(lèi)都不應(yīng)該從具體類(lèi)派生n任何方法都不應(yīng)該覆寫(xiě)它的任何基類(lèi)中已實(shí)現(xiàn)了的方法依賴(lài)于抽象12/16
18、/202139n如果一個(gè)類(lèi)的實(shí)例必須使用另一個(gè)對(duì)象,而這個(gè)對(duì)象又屬于一個(gè)特定的類(lèi),那么復(fù)用性會(huì)受到損害。n如果“使用”類(lèi)只需使用“被使用”類(lèi)的某些方法,而不是要求“被使用”類(lèi)與“使用”類(lèi)有“is-a”的關(guān)系,就可考慮,讓“被使用”類(lèi)實(shí)現(xiàn)一個(gè)接口,“使用”類(lèi)通過(guò)這個(gè)接口來(lái)使用需要的方法,從而限制了類(lèi)之間的依賴(lài)。n方案:為避免類(lèi)之間因彼此使用而造成的耦合,讓它們通過(guò)接口間接使用。約束12/16/202140nDIP可應(yīng)用于任何存在一個(gè)類(lèi)向另一個(gè)類(lèi)發(fā)送消息的地方。DIP應(yīng)用12/16/202141例ClientService12/16/202142例-找出潛在的抽象ClientClient Inte
19、rfaceService12/16/202143w實(shí)例n考慮一個(gè)控制熔爐調(diào)節(jié)器的軟件,該軟件可以從一個(gè)IO通道中讀取當(dāng)前的溫度,并通過(guò)向另一個(gè)IO通道發(fā)送命令來(lái)指示熔爐的開(kāi)或者關(guān)。12/16/202144n優(yōu)先使用(對(duì)象)組合,而非(類(lèi))繼承nFavor Composition Over Inheritance 4.組合復(fù)用原則12/16/202145n容器類(lèi)僅能通過(guò)被包含對(duì)象的接口來(lái)對(duì)其進(jìn)行訪問(wèn)。n“黑盒”復(fù)用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)對(duì)外是不可見(jiàn)。n封裝性好。n實(shí)現(xiàn)上的相互依賴(lài)性比較小。n每一個(gè)類(lèi)只專(zhuān)注于一項(xiàng)任務(wù)。n通過(guò)獲取指向其它的具有相同類(lèi)型的對(duì)象引用,可以在運(yùn)行期間動(dòng)態(tài)地定義(對(duì)象的
20、)組合。組合優(yōu)點(diǎn)12/16/202146n從而導(dǎo)致系統(tǒng)中的對(duì)象過(guò)多。n為了能將多個(gè)不同的對(duì)象作為組合塊(composition block)來(lái)使用,必須仔細(xì)地對(duì)接口進(jìn)行定義。組合缺點(diǎn)12/16/202147n(類(lèi))繼承是一種通過(guò)擴(kuò)展一個(gè)已有對(duì)象的實(shí)現(xiàn),從而獲得新功能的復(fù)用方法。n泛化類(lèi)(超類(lèi))可以顯式地捕獲那些公共的屬性和方法。n特殊類(lèi)(子類(lèi))則通過(guò)附加屬性和方法來(lái)進(jìn)行實(shí)現(xiàn)的擴(kuò)展繼承12/16/202148n容易進(jìn)行新的實(shí)現(xiàn),因?yàn)槠浯蠖鄶?shù)可繼承而來(lái)。n易于修改或擴(kuò)展那些被復(fù)用的實(shí)現(xiàn)。繼承優(yōu)點(diǎn)12/16/202149n破壞了封裝性,因?yàn)檫@會(huì)將父類(lèi)的實(shí)現(xiàn)細(xì)節(jié)暴露給子類(lèi)。n“白盒”復(fù)用,因?yàn)楦割?lèi)的內(nèi)
21、部細(xì)節(jié)對(duì)于子類(lèi)而言通常是可見(jiàn)的。n當(dāng)父類(lèi)的實(shí)現(xiàn)更改時(shí),子類(lèi)也不得不會(huì)隨之更改。n從父類(lèi)繼承來(lái)的實(shí)現(xiàn)將不能在運(yùn)行期間進(jìn)行改變。繼承缺點(diǎn)12/16/202150n僅當(dāng)下列的所有標(biāo)準(zhǔn)被滿(mǎn)足時(shí),方可使用繼承:1.子類(lèi)表達(dá)了“是一個(gè)的特殊類(lèi)型”,而非“是一個(gè)由所扮演的角色”。2.子類(lèi)的一個(gè)實(shí)例永遠(yuǎn)不需要轉(zhuǎn)化(transmute)為其它類(lèi)的一個(gè)對(duì)象。3.子類(lèi)是對(duì)其父類(lèi)的職責(zé)(responsibility)進(jìn)行擴(kuò)展,而非重寫(xiě)或廢除(nullify)。4.子類(lèi)沒(méi)有對(duì)那些僅作為一個(gè)工具類(lèi)(utility class)的功能進(jìn)行擴(kuò)展。Coad規(guī)則12/16/202151例PersonNameAddressStud
22、entSchoolEmployeeSalary12/16/202152n組合與繼承都是重要的重用方法n在OO開(kāi)發(fā)的早期,繼承被過(guò)度地使用n隨著時(shí)間的發(fā)展,我們發(fā)現(xiàn)優(yōu)先使用組合可以獲得重用性與簡(jiǎn)單性更佳的設(shè)計(jì)n當(dāng)然可以通過(guò)繼承,以擴(kuò)充可用的組合類(lèi)集。n因此組合與繼承可以一起工作n但是我們的基本法則是:優(yōu)先使用對(duì)象組合,而非(類(lèi))繼承小結(jié)12/16/202153nLaw of Demetern又稱(chēng) 最少知識(shí)原則,一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象盡可能少的了解。5.迪米特法則 (LoD)12/16/202154n控制信息過(guò)載,提高封裝能力。n1.創(chuàng)建弱耦合類(lèi),利于復(fù)用n2.降低成員訪問(wèn)權(quán)限n3.設(shè)計(jì)不變類(lèi)廣義12/16/202155n如果兩個(gè)類(lèi)不必彼此通信,那么這兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個(gè)類(lèi)需要調(diào)用另一個(gè)類(lèi)的某一個(gè)方法的話,可通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。狹義12/16/202156Void Someone:Operation1(Friend friend) Stranger strang
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小自考漢語(yǔ)言文學(xué)2024年學(xué)習(xí)習(xí)慣試題及答案
- 深度研究2024年統(tǒng)計(jì)學(xué)考試試題及答案
- 小學(xué)六年級(jí)文學(xué)常識(shí)試題及答案
- 汽車(chē)維修常用材料知識(shí)試題及答案
- 二手車(chē)交易流程詳解試題及答案
- 上海bim工程師試題及答案
- 四川省綿陽(yáng)江油市2022-2023學(xué)年高一下學(xué)期期中考試生物學(xué)試題(含答案)
- 美容師實(shí)操技能要求與公務(wù)員省考試題及答案
- 期末誠(chéng)信考試教育
- 2024年抽樣誤差計(jì)算試題答案
- GBZ(衛(wèi)生) 49-2014職業(yè)性噪聲聾的診斷
- JJG 141-2000工作用貴金屬熱電偶
- GB/T 17193-1997電氣安裝用超重荷型剛性鋼導(dǎo)管
- 靜配中心理論知識(shí)試題含答案
- 江西檢測(cè)收費(fèi)標(biāo)準(zhǔn)
- 手推割草機(jī)設(shè)計(jì)
- 2023跑狗報(bào)待更新-┫玄機(jī)來(lái)料總區(qū)┣-【萬(wàn)料堂】-有來(lái)萬(wàn)料堂中特不會(huì)難(開(kāi)放注冊(cè))-poweredbydiscuz!archiv
- 精裝修施工現(xiàn)場(chǎng)臨時(shí)用電施工方案
- 西師版數(shù)學(xué)四年級(jí)下冊(cè)全冊(cè)教案
- 應(yīng)急柜檢查表
- (完整版)湘教版地理必修一知識(shí)點(diǎn)總結(jié)
評(píng)論
0/150
提交評(píng)論