




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象的设计原则二-单一职责原则动机在本文中职责是指引起变化的原因。该原则表明,如果你有多个原因去改变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只 负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类。当我们去改变一个具有多个职责的类时可能会影响该类的其他功能。 单一职责原则一个类应该只受一种变化的影响。单一职责原则简单而直观,但是在实际实现中可能是很困难的。 实例假设我们需要一个对象保存email信息,在下面的例子中我们将使用IEMAIL接口。初看起来,一切都很好。但是仔细分析我们会发现我们的 IEMAIL接口和Email类具有
2、两个职责(两种引起改变的原因)。一个是在一些类似pop3和imap的email协议下使用该类,如果需要支持其他 的协议,需要以其他的方式格式化内容字段,并且需要添加新的代码来支持新的协议。另一个是Content字段,尽管content字段是字符串类型,或许 我们将来要支持其他的格式,例如HTML格式。 如果我们只用一个类,一个职责的改变可能会影响另一个:· 添加新的协议需要添加新的代码解析和格式化内容字段。· 添加新的内容类型(例如HTML)需要为每种已实现的协议添加代码。 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; 我们可以创建一个新的IContent接口和一个新的Content类来分离职责。让每一个类只承担一个职责可以给我们的设计带来更多的灵活性:· 添加新的协议时只需要修改Email类。
9、3; 添加新的内容类型时只需要修改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; 总结单一职责原则代表了设计应用程序时一种很好的识别类的方式,并且它提醒你思考一个类的所有演化方式。只有对应用程序的工作方式有了很好的理解,才能 很好的分离职责。/我们知道,在面向对象设计中要做到高内聚低耦合。而单一职责原则就 是实现高内聚低耦合的最好办法。面向对象设计中单一职责原则是 指: 一个类只负责一个功能领域中的相应职责。 如果一个类承担的职责过多,就等于把这些职责耦合在了一起。当其中一个职责变化时,可能影响其他职责的运作。 下面
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; 现在有两个不同的应用程序用到了类CSquare,一个是有关几何计算方面的,另一个是有关图形方面的。对于前者而说,程序从来不需要绘制图形;而对于后 者来说,程序也从来不需要计算图形的面积。 在上面这种情况下,我们的设计就违反了单一职责原则。它即提供了几何计算方面的功能,又提供了图形绘制方面的功能。这样,在 有关几何计算方面的应用程序中就要链接图形显示方面的库文件;而在有关图形方面的应用程序中却链接了数学计算方面的库文件。而这些多余的链接其实是不必要 的。它们不但会使编译、链接的时间变长,而且会使应用程序占
20、用的内存增加。如果我们对图形的显示代码做了修改,那么有关几何计算方面的应用程序就要重新链 接。我们为什么要为自己不需要的功能重新链接自己的程序呢?因此,上面的设计是不正确的。 下面是一个符合单一职责原则的设计。在这个设计中,把原来的类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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论