面向?qū)ο蟮脑O(shè)計(jì)原則二資料_第1頁
面向?qū)ο蟮脑O(shè)計(jì)原則二資料_第2頁
面向?qū)ο蟮脑O(shè)計(jì)原則二資料_第3頁
面向?qū)ο蟮脑O(shè)計(jì)原則二資料_第4頁
面向?qū)ο蟮脑O(shè)計(jì)原則二資料_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論