前言

Robert C. Martin氏为我们总结了在面向对象的设计(OOD)中应该遵循的原则,这些原则被称为“Principles of OOD”,关于“Principles of OOD”的相关文章可以从Object Menter得到。

本文介绍“Principles of OOD”中的单一职责原则:Single Responsibility Principle (SRP)。

可以从这里查看Single Responsibility Principle (SRP)的原文

概要

There should never be more than one reason for a class to change.
永远不要让一个类存在多个改变的理由。
换句话说,如果一个类需要改变,改变它的理由永远只有一个。如果存在多个改变它的理由,就需要重新设计该类。

SRP(Single Responsibility Principle)原则的核心含意是:只能让一个类有且仅有一个职责。这也是单一职责原则的命名含义。

为什么一个类不能有多于一个以上的职责呢?
如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,而这种变化将影响到该类不同职责的使用者(不同用户):
1,一方面,如果一个职责使用了外部类库,则使用另外一个职责的用户却也不得不包含这个未被使用的外部类库。
2,另一方面,某个用户由于某个原因需要修改其中一个职责,另外一个职责的用户也将受到影响,他将不得不重新编译和配置。
这违反了设计的开闭原则,也不是我们所期望的。

职责的划分

既然一个类不能有多个职责,那么怎么划分职责呢?
Robert.C Martin给出了一个著名的定义:所谓一个类的一个职责是指引起该类变化的一个原因。
If you can think of more than one motive for changing a class, then that class has more than one responsibility.
如果你能想到一个类存在多个使其改变的原因,那么这个类就存在多个职责。

Single Responsibility Principle (SRP)的原文里举了一个Modem的例子来说明怎么样进行职责的划分,这里我们也沿用这个例子来说明一下:

SRP违反例:
Modem.java
interface Modem {
    public void dial(String pno);    //拨号
    public void hangup();        //挂断
    public void send(char c);    //发送数据
    public char recv();        //接收数据
}
咋一看,这是一个没有任何问题的接口设计。但事实上,这个接口包含了2个职责:第一个是连接管理(dial, hangup);另一个是数据通信(send, recv)。很多情况下,这2个职责没有任何共通的部分,它们因为不同的理由而改变,被不同部分的程序调用。
所以它违反了SRP原则。

下面的类图将它的2个不同职责分成2个不同的接口,这样至少可以让客户端应用程序使用具有单一职责的接口:

让ModemImplementation实现这两个接口。我们注意到,ModemImplementation又组合了2个职责,这不是我们希望的,但有时这又是必须的。通常由于某些原因,迫使我们不得不绑定多个职责到一个类中,但我们至少可以通过接口的分割来分离应用程序关心的概念。
事实上,这个例子一个更好的设计应该是这样的,如图:

小结

Single Responsibility Principle (SRP)从职责(改变理由)的侧面上为我们对类(接口)的抽象的颗粒度建立了判断基准:在为系统设计类(接口)的时候应该保证它们的单一职责性。

转载于:https://www.cnblogs.com/silverLee/archive/2010/02/05/1664308.html

Single Responsibility Principle (SRP) - OO设计的单一职责原则相关推荐

  1. 面向对象设计之单一职责原则(Simple-Responsibility Principle)

    单一职责原则: 一个类只负责一个功能领域中的相应职责,即就一个类而言,应该只有一个引起它变化的原因.  好处: 降低类的复杂度,一个类只负责一项职责,其逻辑肯定比负责多项职责简单的多 复杂度低,可读性 ...

  2. 面向对象设计原则之一:单一职责原则

    单一职责原则(Single Responsibility Principle SRP) There should never be more than one reason for a class t ...

  3. 设计模式---面向对象设计原则之单一职责原则

    单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领 ...

  4. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  5. 六大设计原则之单一职责原则

    单一职责原则 单一职责原则(Single Responsibility Principle)–SRP: There should never be more than one reason for a ...

  6. 设计原则 - 单一职责原则

    目录 概念 编码 单一职责的体现(类) 实例 改进 单一职责的体现(接口) 实例 改进 源码 概念 定义:单一职责原则(Single Responsibility Principle,SRP),一个类 ...

  7. 设计模式(单一职责原则)

    一 . 单一职责原则(Single Responsibility Principle, SRP) 1.  一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原 ...

  8. 设计模式-单一职责原则-实践运用

    单一职责原则-概念 1.单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小. 2.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, S ...

  9. 面向对象五大原则_1.单一职责原则amp;2.里氏替换原则

    单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...

最新文章

  1. vant weapp 多选上传图片_iPhone竟然可以压缩图片?一秒1.7MB瞬间变0.08MB,太逆天了吧...
  2. Apache与Nginx网络模型
  3. 转:[kipmi0]进程导致系统负载高
  4. 范例ppt_经营计划与执行管理PPT,全内容商业计划书,完整课件快速套用
  5. maya 替换名称_maya替换对象,MAYA
  6. pytorch--torch.zeros()怎么使用
  7. Kalman Filter—Data Fusion, Covarince Matrix, State Space Representation, Observation
  8. 软件测试算是后端吗,软件测试--前后端数据交互
  9. 北京邮电大学计算机学院考研调剂,2020考研调剂信息:北京邮电大学计算机学院招生信息...
  10. 百度关键词排名查询源码_推荐4个Google关键词排名查询工具
  11. codeforces228A Is your horseshoe on the other hoof?(水题)
  12. win10图片打开方式里没有默认照片查看器的解决方法
  13. Flutter 实现风车加载动画组件
  14. laravel轮播图管理api
  15. 2019HDU多校第一场 HDU6578 Blank
  16. 进程与程序的区别与联系
  17. ahk实现共性与特化
  18. java实现生成纯色图片代码实例
  19. win10怎么更改账户名称_如何自定义WIN10登陆界面的用户名?
  20. PIV流场流速矢量图、流线图(MATLAB quiver函数的用法)

热门文章

  1. Puppet基础篇7-编写第一个完整测试模块puppet
  2. php完全匹配,如何在PHP中使用正则表达式找到完全匹配的内容?
  3. 如何双击就以管理员身份运行批处理
  4. PhoneGap对比html5写android应用程序【android进化三十八】
  5. Ora-01008错误:oracle 并非所有变量都已绑定的原因
  6. Android存储-SharedPreferences
  7. 自动化测试框架搭建三python环境安装selenium和手动下载安装selenium的方法
  8. 苹果原生文字转语音播报
  9. 专访死马:为什么说Egg.js是企业级Node框架
  10. Solidity safesub防止溢出