版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)計(jì)模式第一講設(shè)計(jì)原則主講:林金星第一頁,共四十二頁。第一章
單一職責(zé)原則第二章
接口隔離原則第三章
里氏代換原則第四章
依賴倒轉(zhuǎn)原則第五章
迪米特法則第六章
開放封閉原則第二頁,共四十二頁。你能從電腦設(shè)計(jì)想到如何進(jìn)行軟件設(shè)計(jì)嗎?第三頁,共四十二頁。第一章
單一職責(zé)原則定義:應(yīng)該有且只有一個(gè)原因引起類的變化.
如果一個(gè)類承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在一起,一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)變化發(fā)生時(shí),設(shè)計(jì)會(huì)遭到意想不到的破壞。第四頁,共四十二頁。單一職責(zé)的好處:
1、類的復(fù)雜性降低,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義;
2、可讀性提高了,復(fù)雜性降低了,可讀性自然也就提高了;
3、可維護(hù)性提高了,可讀性提高了,那當(dāng)然可讀性就提高了;
4、變更引起的風(fēng)險(xiǎn)降低,變更是必不可少的,如果一個(gè)接口的單一職責(zé)做的好,一個(gè)接口的修改只對(duì)相應(yīng)的實(shí)現(xiàn)類有影響,對(duì)其他接口無影響,這對(duì)系統(tǒng)的擴(kuò)展性、維護(hù)性都有很大的幫助第五頁,共四十二頁。classcShape{public:virtual~cShape();virtualvoidDraw()=0;
/*
繪制圖形
*/virtualdoubleGetArea()=0;/*獲取面積
*/};classcSquare:publiccShape{public:voidDraw();doubleGetArea();
voidSetWidth(doubledWidth);doubleGetWidth();private:doublem_dWidth;};第六頁,共四十二頁。
現(xiàn)在有兩個(gè)不同的應(yīng)用程序用到了類cSquare,一個(gè)是有關(guān)幾何計(jì)算方面的,另一個(gè)是有關(guān)圖形方面的。對(duì)于前者而說,程序從來不需要繪制圖形;而對(duì)于后者來說,程序也從來不需要計(jì)算圖形的面積。在上面這種情況下,我們的設(shè)計(jì)就違反了單一職責(zé)原則。下面是一個(gè)符合單一職責(zé)原則的設(shè)計(jì)。在這個(gè)設(shè)計(jì)中,把原來的類cShape分為兩個(gè)類:第七頁,共四十二頁。cGeometricShape和cGraphicalShape,來分別承擔(dān)幾何和圖形兩方面的職責(zé)。同樣,分別派生出GGeometricSquare和cGraphicalSquare。第八頁,共四十二頁。classcGeometricShape{public:virtual~cGeometricShape();virtualdoubleGetArea()=0;};classGGeometricSquare:publiccGeometricShape{public:doubleGetArea();voidSetWidth(doubledWidth);doubleGetWidth();private:doublem_dWidth;};第九頁,共四十二頁。classcGraphicalShape{public:virtual~cGraphicalShape();virtualvoidDraw()=0;};classcGraphicalSquare:publiccGraphicalShape{public:voidDraw();voidSetWidth(doubledWidth);doubleGetWidth();private:doublem_dWidth;};第十頁,共四十二頁。第二章
接口隔離原則接口隔離原則表明客戶端不應(yīng)該被強(qiáng)迫實(shí)現(xiàn)一些他們不會(huì)使用的接口,應(yīng)該把胖接口中的方法分組,然后用多個(gè)接口代替它,每個(gè)接口服務(wù)于一個(gè)子模塊。接口隔離原則是對(duì)接口進(jìn)行規(guī)范約束,其包含以下四層含義:1.接口盡量要小這是接口隔離原則的核心定義,不出現(xiàn)臃腫的接口。第十一頁,共四十二頁。classIWorker{public:
virtualvoidwork()=0;virtualvoideat()=0;};classWorker:publicIWorker{public:voidwork(){//....working}voideat(){//....eatinginlaunchbreak}};工廠改進(jìn)生產(chǎn)后,買進(jìn)一批機(jī)器人,如果機(jī)器人也繼承IWorker,將會(huì)出現(xiàn)接口臃腫的情況。因?yàn)闄C(jī)器人不需要實(shí)現(xiàn)eat方法。第十二頁,共四十二頁。classIWorkable{public:virtualvoidwork()=0;};classIFeedable{public:virtualvoideat()=0;};classWorker:publicIWorkable,IFeedable{public:voidwork(){//....working}voideat(){//....eatinginlaunchbreak}};第十三頁,共四十二頁。classRobot:publicIWorkable{public:voidwork(){//....working}}但是“小”是有限度的,首先就是不能違反單一職責(zé)原則。第十四頁,共四十二頁。classIConnectionManager{public:virtualvoiddial(char*number)=0;virtualvoidhuangup()=0;};classIDataTransfer{public:virtualvoidchat()=0;virtualvoidanswer()=0;};classPhone{private:IConnectionManager&cm;IDataTransfer&dt;};第十五頁,共四十二頁。2.接口要高內(nèi)聚什么是高內(nèi)聚?高內(nèi)聚就是提高接口、類、模塊的處理能力,減少對(duì)外的交互。具體到接口隔離原則就是,要求在接口中盡量少公布public方法,接口是對(duì)外的承諾,承諾越少對(duì)系統(tǒng)的開發(fā)越有利,變更的風(fēng)險(xiǎn)也就越少,同時(shí)也有利于降低成本。第十六頁,共四十二頁。3.定制服務(wù)
一個(gè)系統(tǒng)或系統(tǒng)內(nèi)的模塊之間必然會(huì)有耦合,有耦合就要有相互訪問的接口,我們?cè)O(shè)計(jì)時(shí)就需要為各個(gè)訪問者(也就客戶端)定制服務(wù)。我們?cè)谧鱿到y(tǒng)設(shè)計(jì)時(shí)也需要考慮對(duì)系統(tǒng)之間或模塊之間的接口要采用定制服務(wù)。采用定制服務(wù)就必然有一個(gè)要求:只提供訪問者需要的方法。第十七頁,共四十二頁。4.接口設(shè)計(jì)是有限度的接口的設(shè)計(jì)粒度越小,系統(tǒng)越靈活,這是不爭(zhēng)的事實(shí)。但是,靈活的同時(shí)也帶來了結(jié)構(gòu)的復(fù)雜化,開發(fā)難度增加,可維護(hù)性降低,這不是一個(gè)項(xiàng)目或產(chǎn)品所期望看到的,所以接口設(shè)計(jì)一定要注意適度,這個(gè)“度”如何來判斷的呢?根據(jù)經(jīng)驗(yàn)和常識(shí)判斷,沒有一個(gè)固化或可測(cè)量的標(biāo)準(zhǔn)。第十八頁,共四十二頁。第三章
里氏代換原則定義:所有引用基類的地方必須能透明地使用其子類的對(duì)象。只有滿足以下2個(gè)條件的OO設(shè)計(jì)才可被認(rèn)為是滿足了LSP原則:1.不應(yīng)該在代碼中出現(xiàn)if/else之類對(duì)子類類型進(jìn)行判斷的條件。以下代碼就違反了LSP定義。第十九頁,共四十二頁。if(objtypeofClass1){dosomething}elseif(objtypeofClass2){dosomethingelse}2.子類應(yīng)當(dāng)可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方,或者說如果我們把代碼中使用基類的地方用它的子類所代替,代碼還能正常工作,其它行為不會(huì)發(fā)生變化。第二十頁,共四十二頁。里氏替換原則LSP是使代碼符合開閉原則的一個(gè)重要保證。同時(shí)LSP體現(xiàn)了:1.類的繼承原則:如果一個(gè)繼承類的對(duì)象可能會(huì)在基類出現(xiàn)的地方出現(xiàn)運(yùn)行錯(cuò)誤,則該子類不應(yīng)該從該基類繼承,或者說,應(yīng)該重新設(shè)計(jì)它們之間的關(guān)系。2.動(dòng)作正確性保證:從另一個(gè)側(cè)面上保證了符合LSP設(shè)計(jì)原則的類的擴(kuò)展不會(huì)給已有的系統(tǒng)引入新的錯(cuò)誤。第二十一頁,共四十二頁。classRectangle{public:doublegetHeight(){returnm_height;}voidsetHeight(doubleheight){m_height=height;}doublegetWidth(){returnm_width;}voidsetWidth(doublewidth){m_width=width;}private:doublem_width;doublem_height;};第二十二頁,共四十二頁。classSquare:publicRectangle{public:voidsetHeight(doubleheight){Rectangle::setHeight(height);Rectangle::setWidth(height);}voidsetWidth(doublewidth){Rectangle::setHeight(width);Rectangle::setWidth(width);}};voidmain(){Squarer;r.setWidth(5);r.setHeight(4);if(r.getWidth()*r.getHeight()!=20){throw"exception!!!\n";}}第二十三頁,共四十二頁。包含以下四層含義:1、子類必須完全實(shí)現(xiàn)父類的方法;2、子類可以有自己的特性;3、覆寫或者實(shí)現(xiàn)父類的方法時(shí)輸入的參數(shù)可以被放大;4、覆寫或者實(shí)現(xiàn)父類的方法時(shí)輸出的結(jié)果可以被縮?。坏诙捻?,共四十二頁。classIConnectionManager{public:virtualIConnectionManager*self()=0;};classConnectionManager:publicIConnectionManager{public:ConnectionManager*self(){returnthis;};};classHTTPConnectionManager:publicConnectionManager{public:HTTPConnectionManager*self(){cout<<"HTTPConnectionManagerreturnself\n";returnthis;};};第二十五頁,共四十二頁。實(shí)現(xiàn)好處:使用里氏替換原則的目的是增強(qiáng)程序的健壯性,版本升級(jí)時(shí)也可以保持非常好的兼容性,即使增加子類,原有的子類還是可以繼續(xù)運(yùn)行,在實(shí)際應(yīng)用中,每個(gè)子類對(duì)應(yīng)不同的業(yè)務(wù)含義,使用父類作為參數(shù),傳遞不同的子類則可以完成不同的業(yè)務(wù)邏輯。當(dāng)然,要使用子類的“個(gè)性化”業(yè)務(wù)邏輯,必須創(chuàng)建子類的對(duì)象,不過采用里氏替換原則設(shè)計(jì)類時(shí),應(yīng)盡量避免子類的“個(gè)性化”。第二十六頁,共四十二頁。第四章
依賴倒轉(zhuǎn)原則
定義:高層模塊不應(yīng)該依賴底層模塊,兩者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象;我們現(xiàn)在來看看依賴有幾種,依賴也就是耦合,分為下面三種1.零耦合(NilCoupling)關(guān)系,兩個(gè)類沒有依賴關(guān)系,那就是零耦合.2.具體耦合(ConcreteCoupling)關(guān)系,兩個(gè)具體的類之間有依賴關(guān)系,那么就是具體耦第二十七頁,共四十二頁。合關(guān)系,如果一個(gè)具體類直接引用另外一個(gè)具體類,就會(huì)發(fā)生這種關(guān)系.3.抽象耦合(AbstractCoupling)關(guān)系.這種關(guān)系發(fā)生在一個(gè)具體類和一個(gè)抽象類之間,這樣就使必須發(fā)生關(guān)系的類之間保持最大的靈活性.classQQCar{public:voidPutIntoGear(){std::cout<<"掛檔";};
void
StepOnAccelerator(){std::cout<<"踩油門";}voidControlDirection(){std::cout<<"打方向";}};第二十八頁,共四十二頁。classPerson{public:
Person(){m_car=newQQCar();}voiddrive(){m_car->PutIntoGear();m_car->StepOnAccelerator();m_car->ControlDirection();}private:QQCar*m_car;};例子中QQCar和Person類發(fā)生了具體耦合,如果Person類要開BMW牌子的車時(shí),就需要更改第二十九頁,共四十二頁。Person類的代碼,造成維護(hù)的困難。修改如下:classICar{public:virtualvoidPutIntoGear()=0;virtualvoidStepOnAccelerator()=0;virtualvoidControlDirection()=0;};第三十頁,共四十二頁。classQQCar:publicICar{public:voidPutIntoGear(){cout<<"掛檔";};
void
StepOnAccelerator(){cout<<“踩油門”;}voidControlDirection(){cout<<"打方向”;}};ClassBMWCar:publicICar第三十一頁,共四十二頁。{public:voidPutIntoGear(){cout<<"掛檔";};
void
StepOnAccelerator(){cout<<“踩油門”;}voidControlDirection(){cout<<"打方向”;}};classPerson{public:第三十二頁,共四十二頁。Person(ICar*car):m_car(car){}voiddrive(){m_car->PutIntoGear();m_car->StepOnAccelerator();m_car->ControlDirection();}private:ICar*m_car;};第三十三頁,共四十二頁。依賴倒置原則的本質(zhì)就是通過抽象(抽象類或者接口)使各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立,不互相影響,實(shí)現(xiàn)模塊見的松耦合,如果需要使用該規(guī)則,需要遵循以下幾個(gè)規(guī)則:
1、每個(gè)類盡量都有接口或者抽象類,或者抽象類和接口兩者都具備(這個(gè)是該原則的基本要求,接口和抽象類都是抽象,有了抽象才可能依賴倒置);
2、變量的表面類型盡量是接口或者抽象類;
第三十四頁,共四十二頁。3、任何類都不應(yīng)該從具體類派生;4、盡量不要覆寫基類的方法(如果基類是一個(gè)抽象類,并且該方法已經(jīng)實(shí)現(xiàn)了,子類盡量不要覆寫。類間依賴的是抽象,覆寫了抽象方法,對(duì)依賴的穩(wěn)定性會(huì)產(chǎn)生一定的影響);5、結(jié)合里氏替換法使用;第三十五頁,共四十二頁。如何做到依賴倒轉(zhuǎn)原則?
以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。抽象耦合關(guān)系總要涉及具體類從抽象類繼承,并且需要保證在任何引用到基類的地方都可以改換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。第三十六頁,共四十二頁。依賴倒轉(zhuǎn)原則的優(yōu)缺點(diǎn)雖然很強(qiáng)大,但卻最不容易實(shí)現(xiàn)。因?yàn)橐蕾嚨罐D(zhuǎn)的緣故,對(duì)象的創(chuàng)建很可能要使用對(duì)象工廠,以避免對(duì)具體類的直接引用,此原則的使用
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融機(jī)構(gòu)貸款合同模板
- 舞臺(tái)桁架搭建協(xié)議
- 專業(yè)合同種植技術(shù)服務(wù)樣本
- 招標(biāo)文件標(biāo)準(zhǔn)范例
- 個(gè)人創(chuàng)業(yè)非固定員工保證書
- 保證書格式典范
- 廣告服務(wù)合同的履行標(biāo)準(zhǔn)
- 嫖娼問題自我反省書
- 買賣合同取消協(xié)議書
- 防雷工程合作協(xié)議范本
- 2024年華潤燃?xì)饧瘓F(tuán)招聘筆試參考題庫含答案解析
- 岸基維修協(xié)議
- (完整版)翻譯技巧翻譯方法
- 中醫(yī)護(hù)理技術(shù)操作平衡火罐技術(shù)操作流程與考核評(píng)分標(biāo)準(zhǔn)
- 2023年10月上海社會(huì)科學(xué)院工作人員招考聘用筆試歷年難易錯(cuò)點(diǎn)考題薈萃附帶答案詳解
- 《法理學(xué)》(第三版教材)形成性考核作業(yè)1234答案
- 植物的抗熱性
- 《人際關(guān)系與溝通技巧》(第3版)-教學(xué)大綱
- 2023年中醫(yī)養(yǎng)生之藥膳食療考試試題
- 某土石方施工工程主要施工機(jī)械設(shè)備表
- 硅PU(塑料面層)檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
評(píng)論
0/150
提交評(píng)論