面向?qū)ο笃叽笤瓌t_第1頁
面向?qū)ο笃叽笤瓌t_第2頁
面向?qū)ο笃叽笤瓌t_第3頁
面向?qū)ο笃叽笤瓌t_第4頁
面向?qū)ο笃叽笤瓌t_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

☆面向?qū)ο蟮钠叽笤瓌t:、☆面向?qū)ο蟮钠叽笤瓌t:1) 開閉原則;------面向擴(kuò)展開放,面向修改關(guān)閉。2) 里氏轉(zhuǎn)換原則;------超類存在的地方,子類是可以替換的。3) 依賴倒轉(zhuǎn)原則;------實(shí)現(xiàn)盡量依賴抽象,不依賴具體實(shí)現(xiàn)。4) 接口隔離原則;------應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口,而不是提供大的總的接口。5) 組合/聚合復(fù)用原則;------盡量使用合成/聚合達(dá)到復(fù)用,盡量少用繼承。原則:一個(gè)類中有另一個(gè)類的對(duì)象。6) “迪米特”法則;------又叫最少知識(shí)原則,一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。7) 單一職責(zé)原則。-----每一個(gè)類應(yīng)該專注于做一件事情。二、 開閉原則OCP:開閉原則是設(shè)計(jì)原則基礎(chǔ)的基礎(chǔ),是java面向?qū)ο蟮暮诵脑瓌t,其它原則均圍繞開閉原則進(jìn)行展開。開閉原則指的是一個(gè)軟件實(shí)體應(yīng)對(duì)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉(Softwareentitiesshouldbeopenforextension,butclosedformodification)。這個(gè)原則是說在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)對(duì)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展,換言之,應(yīng)對(duì)可以不必修改源代碼的情況下改變這個(gè)模塊的行為?!顫M足開閉原則的軟件系統(tǒng)的優(yōu)越性:通過擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對(duì)軟件的新需求,使變化中的軟件系統(tǒng)有一定的適應(yīng)性和靈活性。已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性?!顚?shí)現(xiàn)開閉原則的關(guān)鍵抽象化是解決問題的關(guān)鍵,在面向?qū)ο蟮木幊陶Z言里,可以給系統(tǒng)定義出一套相對(duì)較為固定的抽象設(shè)計(jì),此設(shè)計(jì)允許無窮無盡的行為在實(shí)現(xiàn)層被實(shí)現(xiàn)。在語言里,可以給出一個(gè)或多個(gè)抽象類或者接口,規(guī)定出所有的具體類必須提供的方法的特征作為系統(tǒng)設(shè)計(jì)的抽象層。這個(gè)抽象層預(yù)見了所有的可擴(kuò)展性,因此,在任何擴(kuò)展情況下都不會(huì)改變。這就使得系統(tǒng)的抽象不需要修改,從而滿足了開閉原則的第二條,對(duì)修改關(guān)閉。同時(shí),由于從抽象層導(dǎo)出一個(gè)或多個(gè)新的具體類可以改變系統(tǒng)的行為,因此系統(tǒng)的設(shè)計(jì)對(duì)擴(kuò)展是開放的,這就滿足了開閉原則的第一條?!顚?duì)可變性的封裝原則把變化的東西封裝起來,把不變的抽象出來。這是對(duì)開閉原則的另外一種描述,它講的是找到一個(gè)系統(tǒng)的可變因素,將之封裝起來。該原則意味著兩點(diǎn):一種可變性不應(yīng)當(dāng)散落在代碼的很多角落,而應(yīng)當(dāng)封裝到一個(gè)對(duì)象里面。繼承應(yīng)當(dāng)被看做是封裝變化的方法,而不應(yīng)該被認(rèn)為是一種從一般對(duì)象生成特殊對(duì)象的方法。一種可變性不應(yīng)當(dāng)與另外一種可變性混合在一起。這意味著一般的繼承層次不會(huì)超過兩層。關(guān)鍵知識(shí)點(diǎn):☆開閉原則的概念,軟件實(shí)體對(duì)擴(kuò)展開發(fā),對(duì)修改關(guān)閉;☆實(shí)現(xiàn)開閉原則的關(guān)鍵,利用接口或抽象類抽象出系統(tǒng)的抽象層,抽象層不變,利用實(shí)現(xiàn)層進(jìn)行擴(kuò)展;☆對(duì)可變性的封裝,將可變的元素封裝起來,防止改變擴(kuò)散到整個(gè)應(yīng)用;☆注意控制封裝的粒度,不要將兩種可變性封裝到一起;☆繼承是用來封裝可變性的,一般的繼承層次不要超過兩層;☆策略模式是對(duì)開閉原則的很好詮釋,其他還有工廠模式、建造模式、橋接模式、門面模式、調(diào)停者模式、訪問者模式和迭代子模式等;☆對(duì)“將條件轉(zhuǎn)移語句改寫成多態(tài)性”的重構(gòu)行為應(yīng)當(dāng)遵循開閉原則,防止多態(tài)性污染;☆java下的單方法接口通常用來實(shí)現(xiàn)函數(shù)指針或者委托的功能;☆任何一棵繼承樹都要以抽象類為根,具體類不是用來繼承的,更不要從工具類繼承;☆抽象類要擁有盡可能多的共同代碼,同時(shí)擁有盡可能少的數(shù)據(jù)?!町?dāng)Coad條件全部滿足時(shí),才應(yīng)當(dāng)考慮使用繼承:派生類是基類的一個(gè)特殊種類,而不是其的一個(gè)角色,也就是說要區(qū)分“Has-a”和“Is-a”;永遠(yuǎn)不會(huì)出現(xiàn)需要將派生類換成另外一個(gè)類的派生類的情況;派生類具有擴(kuò)展基類的責(zé)任而不是具有置換或注銷基類的責(zé)任;只有在分類學(xué)角度上有意義時(shí),才可以使用繼承。三、 里氏代換原則LSP任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。即超類存在的地方,子類是可以替換的。替換后行為不變,結(jié)果會(huì)變化。調(diào)用子類行為。子類和父類必須有相同行為才能完全地實(shí)現(xiàn)替換。實(shí)現(xiàn)開閉原則的關(guān)鍵是抽象化,而里氏代換原則中的基類和子類的繼承關(guān)系正是抽象化的具體體現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。違反里氏代換原則一個(gè)最經(jīng)典的例子便是把正方形設(shè)計(jì)成長(zhǎng)方形的子類。四、 依賴倒轉(zhuǎn)原則DIP要依賴于抽象,不要依賴于實(shí)現(xiàn)。說的白一點(diǎn)就是要依賴于抽象類和接口不要依賴具體類,具體類也就是我們可以用new關(guān)鍵字實(shí)例化的類。依賴倒轉(zhuǎn)原則是實(shí)現(xiàn)開閉原則的一個(gè)手段。五、 合成/聚合復(fù)用原則:要盡量使用合成/聚合達(dá)到復(fù)用,而不是繼承關(guān)系達(dá)到復(fù)用的目的。就如我們前面說的,如果為了復(fù)用,便使用繼承的方式將兩個(gè)不相干的類聯(lián)系在一起,這樣的方式是違反合成/聚合復(fù)用原則的,更進(jìn)一步的后果那便是違反里氏代換原則。合成/聚合復(fù)用和里氏代換原則相輔相成,合成/聚合復(fù)用原則要求我們?cè)趶?fù)用時(shí)首先考慮合成/聚合關(guān)系,而里氏代換原則是要求我們?cè)谑褂美^承時(shí),必須滿足一定的條件。什么是合成?合成:是指一個(gè)整體對(duì)依托他而存在的關(guān)系,例如:一個(gè)人對(duì)他的房子和家具,其中他的房子和家具是不能被共享的,因?yàn)槟切〇|西都是他自己的..并且人沒了,這個(gè)也關(guān)系就沒了..這個(gè)例子就好像,烏雞百鳳丸這個(gè)產(chǎn)品,它是有烏雞和上等藥材合成而來的一樣..也比如網(wǎng)絡(luò)游戲中的武器裝備合成一樣,多種東西合并為一種超強(qiáng)的東西一樣..什么是聚合?聚合:聚合是比合成關(guān)系的一種更強(qiáng)的依賴關(guān)系,聚合是一個(gè)整體對(duì)個(gè)體的部分,例如,一個(gè)奔馳S360汽車,對(duì)奔馳S360引擎,奔馳S360輪胎的關(guān)系..這些關(guān)系就是帶有聚合性質(zhì)的..因?yàn)楸捡YS360引擎和奔馳S360輪胎他們只能被奔馳S360汽車所用,離開了奔馳S360汽車,它們就失去了存在的意義..在我們的設(shè)計(jì)中,這樣的關(guān)系不應(yīng)該頻繁出現(xiàn)..這樣會(huì)增大設(shè)計(jì)的耦合度..原則:一個(gè)類中有另一個(gè)類的對(duì)象。六、 接口隔離原則ISP應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)接口,而不要提供大的總接口。暴露行為讓后面的實(shí)現(xiàn)類知道的越少越好。七、 迪米特法則:(體現(xiàn)松偶合)又叫最少知識(shí)原則,一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象知道的越少越好,即一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。八、 單一職責(zé)原則SRP:(體現(xiàn)高內(nèi)聚)每一個(gè)類應(yīng)該專注于做一件事情。九、 繼承復(fù)用優(yōu)點(diǎn):1、 新的實(shí)現(xiàn)較為容易,因?yàn)槌惖拇蟛糠止δ芸梢酝ㄟ^繼承關(guān)系自動(dòng)進(jìn)入子類。2、 修改或擴(kuò)展繼承而來的實(shí)現(xiàn)比較容易。十、繼承復(fù)用的缺點(diǎn):1、 繼承復(fù)用破壞包裝,將超類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類,超類的內(nèi)部細(xì)節(jié)常常對(duì)子類是透明的,白箱復(fù)用。簡(jiǎn)單,但不安全,不能在程序運(yùn)行中隨便改變。2、 超類的實(shí)現(xiàn)發(fā)生了改變,子類的實(shí)現(xiàn)也不得不改變。3、超類繼承而來的是靜態(tài)的,不可能在運(yùn)行時(shí)間內(nèi)發(fā)生改變,因此沒有足夠的靈活性。十^一、一個(gè)重構(gòu)方法的討論“將條件轉(zhuǎn)移語句改寫成為多態(tài)性”是一條廣為流傳的代碼重構(gòu)做法。這一做法本身并不能保證“開-閉”原則,應(yīng)當(dāng)以“開-閉”原則判斷是否需要改寫成多態(tài)。條件轉(zhuǎn)移并不是錯(cuò)誤,如果需要,完全可以選擇使用條件轉(zhuǎn)移。如果一個(gè)條件轉(zhuǎn)移語句確實(shí)封裝了某種商務(wù)邏輯的可變性,那么將此種可變性封裝起來就符合“開-閉”原則設(shè)計(jì)思想了。如果一個(gè)條件轉(zhuǎn)移語句沒有涉及重要的商務(wù)邏輯,或者不會(huì)隨著時(shí)間的變化而變化,也不意味著任何的可擴(kuò)展性,那么它就沒有涉及任何有意義的可變性。這時(shí)候?qū)⑦@個(gè)條件轉(zhuǎn)移語句改寫成多態(tài)性就是一種沒有意義的浪費(fèi)。抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼在一個(gè)繼承的等級(jí)結(jié)構(gòu)中,共同的代碼應(yīng)當(dāng)盡量向等級(jí)結(jié)構(gòu)的上方移動(dòng)。把重復(fù)的代碼從子類里面移動(dòng)到超類里面,可以提高代碼的復(fù)用率。在代碼發(fā)生改變時(shí),設(shè)計(jì)師之需要修改一個(gè)地方。抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)與代碼的移動(dòng)方向相反,數(shù)據(jù)的移動(dòng)方向是從抽象類到具體類,向等級(jí)結(jié)構(gòu)的下方移動(dòng)。一個(gè)對(duì)象的數(shù)據(jù)不論是否使用都會(huì)占用資源,所以應(yīng)當(dāng)放到等級(jí)結(jié)構(gòu)的低端。十二、什么時(shí)候才應(yīng)當(dāng)使用繼承復(fù)用.子類是超類的一個(gè)特殊種類,而不是超類的一個(gè)角色,Is-A才符合繼承關(guān)系。.永遠(yuǎn)不會(huì)出現(xiàn)需要將子類換成另一個(gè)類的子類的情況。.子類具有擴(kuò)展超類的責(zé)任,而不是具有置換掉(Override)和注銷掉(Nullify)超類的責(zé)任。.只有在分類學(xué)角度上有意義時(shí),才可以使用繼承,不要從工具類繼承。卜三、使用接口與抽象類的優(yōu)缺點(diǎn)十三、使用接口與抽象類的優(yōu)缺點(diǎn)1、 抽象類可以提供某些方法的部分實(shí)現(xiàn),而接口不可以有具體實(shí)現(xiàn)。換言之對(duì)于抽象類而言可向一個(gè)抽象類中隨意的增加一個(gè)新的具體方法,其子類型都可以得到該具體方法,而對(duì)于接口則做不到這一點(diǎn)。如果向一個(gè)接口加入一個(gè)新的方法的話,所有實(shí)現(xiàn)這個(gè)接口的子類將無法通過編譯,因?yàn)樗麄儧]有實(shí)現(xiàn)這個(gè)新聲明的方法。2、 一個(gè)抽象類只能由它的子類來實(shí)現(xiàn),這樣其子類就不能再繼承其他的父類了。而對(duì)于Java接口而言,任何一個(gè)實(shí)現(xiàn)了一個(gè)Java接口的類都可以具有這個(gè)接口的類型,而一個(gè)類可以實(shí)現(xiàn)任意多個(gè)接口。3、 從代碼重構(gòu)的角度來看

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論