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

下載本文檔

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

文檔簡介

1、面向?qū)ο蟮脑O計原則二-單一職責原則動機在本文中職責是指引起變化的原因。該原則表明,如果你有多個原因去改變一個類,那么應該把這些引起變化的原因分離開,把這個類分成多個類,每個類只 負責處理一種改變。當你做出某種改變時,只需要修改負責處理該改變的類。當我們?nèi)ジ淖円粋€具有多個職責的類時可能會影響該類的其他功能。 單一職責原則一個類應該只受一種變化的影響。單一職責原則簡單而直觀,但是在實際實現(xiàn)中可能是很困難的。 實例假設我們需要一個對象保存email信息,在下面的例子中我們將使用IEMAIL接口。初看起來,一切都很好。但是仔細分析我們會發(fā)現(xiàn)我們的 IEMAIL接口和Email類具有

2、兩個職責(兩種引起改變的原因)。一個是在一些類似pop3和imap的email協(xié)議下使用該類,如果需要支持其他 的協(xié)議,需要以其他的方式格式化內(nèi)容字段,并且需要添加新的代碼來支持新的協(xié)議。另一個是Content字段,盡管content字段是字符串類型,或許 我們將來要支持其他的格式,例如HTML格式。 如果我們只用一個類,一個職責的改變可能會影響另一個:· 添加新的協(xié)議需要添加新的代碼解析和格式化內(nèi)容字段。· 添加新的內(nèi)容類型(例如HTML)需要為每種已實現(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)建一個新的IContent接口和一個新的Content類來分離職責。讓每一個類只承擔一個職責可以給我們的設計帶來更多的靈活性:· 添加新的協(xié)議時只需要修改Email類。

9、3; 添加新的內(nèi)容類型時只需要修改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é)單一職責原則代表了設計應用程序時一種很好的識別類的方式,并且它提醒你思考一個類的所有演化方式。只有對應用程序的工作方式有了很好的理解,才能 很好的分離職責。/我們知道,在面向?qū)ο笤O計中要做到高內(nèi)聚低耦合。而單一職責原則就 是實現(xiàn)高內(nèi)聚低耦合的最好辦法。面向?qū)ο笤O計中單一職責原則是 指:    一個類只負責一個功能領域中的相應職責。    如果一個類承擔的職責過多,就等于把這些職責耦合在了一起。當其中一個職責變化時,可能影響其他職責的運作。    下面

17、我們用C+的例子來具體說明。    比如我們有如下的設計: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)在有兩個不同的應用程序用到了類CSquare,一個是有關(guān)幾何計算方面的,另一個是有關(guān)圖形方面的。對于前者而說,程序從來不需要繪制圖形;而對于后 者來說,程序也從來不需要計算圖形的面積。    在上面這種情況下,我們的設計就違反了單一職責原則。它即提供了幾何計算方面的功能,又提供了圖形繪制方面的功能。這樣,在 有關(guān)幾何計算方面的應用程序中就要鏈接圖形顯示方面的庫文件;而在有關(guān)圖形方面的應用程序中卻鏈接了數(shù)學計算方面的庫文件。而這些多余的鏈接其實是不必要 的。它們不但會使編譯、鏈接的時間變長,而且會使應用程序占

20、用的內(nèi)存增加。如果我們對圖形的顯示代碼做了修改,那么有關(guān)幾何計算方面的應用程序就要重新鏈 接。我們?yōu)槭裁匆獮樽约翰恍枰墓δ苤匦骆溄幼约旱某绦蚰??因此,上面的設計是不正確的。    下面是一個符合單一職責原則的設計。在這個設計中,把原來的類CShape分為兩個 類:CGeometricShape和CGraphicalShape,來分別承擔幾何和圖形兩方面的職責。同樣,分別派生出 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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論