




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο蟮脑O(shè)計(jì)原則二-單一職責(zé)原則動(dòng)機(jī)在本文中職責(zé)是指引起變化的原因。該原則表明,如果你有多個(gè)原因去改變一個(gè)類,那么應(yīng)該把這些引起變化的原因分離開,把這個(gè)類分成多個(gè)類,每個(gè)類只 負(fù)責(zé)處理一種改變。當(dāng)你做出某種改變時(shí),只需要修改負(fù)責(zé)處理該改變的類。當(dāng)我們?nèi)ジ淖円粋€(gè)具有多個(gè)職責(zé)的類時(shí)可能會影響該類的其他功能。 單一職責(zé)原則一個(gè)類應(yīng)該只受一種變化的影響。單一職責(zé)原則簡單而直觀,但是在實(shí)際實(shí)現(xiàn)中可能是很困難的。 實(shí)例假設(shè)我們需要一個(gè)對象保存email信息,在下面的例子中我們將使用IEMAIL接口。初看起來,一切都很好。但是仔細(xì)分析我們會發(fā)現(xiàn)我們的 IEMAIL接口和Email類具有
2、兩個(gè)職責(zé)(兩種引起改變的原因)。一個(gè)是在一些類似pop3和imap的email協(xié)議下使用該類,如果需要支持其他 的協(xié)議,需要以其他的方式格式化內(nèi)容字段,并且需要添加新的代碼來支持新的協(xié)議。另一個(gè)是Content字段,盡管content字段是字符串類型,或許 我們將來要支持其他的格式,例如HTML格式。 如果我們只用一個(gè)類,一個(gè)職責(zé)的改變可能會影響另一個(gè):· 添加新的協(xié)議需要添加新的代碼解析和格式化內(nèi)容字段。· 添加新的內(nèi)容類型(例如HTML)需要為每種已實(shí)現(xiàn)的協(xié)議添加代碼。 Java代碼 1. /single responsibility
3、60;principle - bad example 2. interface IEmail 3. public void setSender(String sender); 4. public void setReceiver(String receiver);&
4、#160; 5. public void setContent(String content); 6. 7. 8. class Email implements IEmail 9. public void setSender(String sender)
5、; 10. / set sender; 11. 12. 13. public void setReceiver(String receiver) 14.
6、60; / set receiver; 15. 16. 17. public void setContent(String content) 18.
7、; / set content; 19. 20. /single responsibility principle - bad exampleinterface IEmail public void setSender(String sender);public void setReceiver(String receiver);public void setContent(String content);cla
8、ss Email implements IEmail public void setSender(String sender) / set sender; public void setReceiver(String receiver) / set receiver; public void setContent(String content) / set content; 我們可以創(chuàng)建一個(gè)新的IContent接口和一個(gè)新的Content類來分離職責(zé)。讓每一個(gè)類只承擔(dān)一個(gè)職責(zé)可以給我們的設(shè)計(jì)帶來更多的靈活性:· 添加新的協(xié)議時(shí)只需要修改Email類。
9、3; 添加新的內(nèi)容類型時(shí)只需要修改Content類。 Java代碼 1. /single responsibility principle - good example 2. 3. interface IEmail 4. public void setSender(String sender);
10、160;5. public void setReceiver(String receiver); 6. public void setContent(IContent content); 7. 8. 9. interface IContent
11、160; 10. public String getAsString(); / used for serialization 11. 12. 13. class Email implements IEmail 14. public void setSender(String
12、60;sender) 15. / set sender; 16. 17. 18. public void setReceiver(String receive
13、r) 19. / set receiver; 20. 21. 22. public void setContent(IContent content)
14、0; 23. / set content; 24. 25. /single responsibility principle - good exampleinterface IEmail public void setSender(String sender);public void setReceiver(String rece
15、iver);public void setContent(IContent content);interface IContent public String getAsString(); / used for serializationclass Email implements IEmail public void setSender(String sender) / set sender; public void setReceiver(String receiver) / set receiver; public void setContent(IContent content) /
16、set content; 總結(jié)單一職責(zé)原則代表了設(shè)計(jì)應(yīng)用程序時(shí)一種很好的識別類的方式,并且它提醒你思考一個(gè)類的所有演化方式。只有對應(yīng)用程序的工作方式有了很好的理解,才能 很好的分離職責(zé)。/我們知道,在面向?qū)ο笤O(shè)計(jì)中要做到高內(nèi)聚低耦合。而單一職責(zé)原則就 是實(shí)現(xiàn)高內(nèi)聚低耦合的最好辦法。面向?qū)ο笤O(shè)計(jì)中單一職責(zé)原則是 指: 一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)。 如果一個(gè)類承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在了一起。當(dāng)其中一個(gè)職責(zé)變化時(shí),可能影響其他職責(zé)的運(yùn)作。 下面
17、我們用C+的例子來具體說明。 比如我們有如下的設(shè)計(jì):class CShapepublic: virtual CShape(); virtual void Draw() = 0; virtual double GetArea() = 0;class CSquare : public CS
18、hapepublic: void Draw(); double GetArea(); void SetWidth(double dWidth); double GetWidth();private: double
19、m_dWidth; 現(xiàn)在有兩個(gè)不同的應(yīng)用程序用到了類CSquare,一個(gè)是有關(guān)幾何計(jì)算方面的,另一個(gè)是有關(guān)圖形方面的。對于前者而說,程序從來不需要繪制圖形;而對于后 者來說,程序也從來不需要計(jì)算圖形的面積。 在上面這種情況下,我們的設(shè)計(jì)就違反了單一職責(zé)原則。它即提供了幾何計(jì)算方面的功能,又提供了圖形繪制方面的功能。這樣,在 有關(guān)幾何計(jì)算方面的應(yīng)用程序中就要鏈接圖形顯示方面的庫文件;而在有關(guān)圖形方面的應(yīng)用程序中卻鏈接了數(shù)學(xué)計(jì)算方面的庫文件。而這些多余的鏈接其實(shí)是不必要 的。它們不但會使編譯、鏈接的時(shí)間變長,而且會使應(yīng)用程序占
20、用的內(nèi)存增加。如果我們對圖形的顯示代碼做了修改,那么有關(guān)幾何計(jì)算方面的應(yīng)用程序就要重新鏈 接。我們?yōu)槭裁匆獮樽约翰恍枰墓δ苤匦骆溄幼约旱某绦蚰??因此,上面的設(shè)計(jì)是不正確的。 下面是一個(gè)符合單一職責(zé)原則的設(shè)計(jì)。在這個(gè)設(shè)計(jì)中,把原來的類CShape分為兩個(gè) 類:CGeometricShape和CGraphicalShape,來分別承擔(dān)幾何和圖形兩方面的職責(zé)。同樣,分別派生出 GGeometricSquare和CGraphicalSquare。class CGeometricShapepublic: virtual CGeometricShape(); virtual double GetArea() = 0;class GGeometricSquare : public CGeometricShapepublic: double GetArea();
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)藥銷售代理合同全文
- 化工原料進(jìn)口代理合同(范本)
- 夫妻和諧共處合同書
- 員工合同樣本集錦
- 國內(nèi)快遞運(yùn)輸服務(wù)合同細(xì)則
- 單位公益捐贈合同協(xié)議
- 合資公司成立的投資合同范本
- 合成氣生產(chǎn)中的催化劑考核試卷
- 寵物友好公共設(shè)施清潔保養(yǎng)質(zhì)量監(jiān)管考核試卷
- 康復(fù)輔具適配與物理治療結(jié)合考核試卷
- 中國控制會議論文模板英文
- 機(jī)器人技術(shù) 第一章緒論
- 前廳羅盤系統(tǒng)操作細(xì)則
- 2_甲基丙烯酰氧基乙基磷酰膽堿共聚物應(yīng)用研究進(jìn)展
- 迅達(dá)扶梯9300AE故障代碼
- 二年級下冊數(shù)學(xué)課件-第三單元 對稱圖形 ppt(29張) 北京版(2021秋)
- 乒乓球--社團(tuán)活動(dòng)記錄表(共20頁)
- 《各種各樣的橋》ppt課件
- 滬教版小學(xué)數(shù)學(xué)二年級下冊應(yīng)用題專項(xiàng)練習(xí)
- 機(jī)動(dòng)車維修經(jīng)營備案表
- 索取備案系統(tǒng)帳號申請書
評論
0/150
提交評論