一、总览

SRP: Single responsibility principle
There should never be more than one reason for a class to change.
基本思想:高内聚,低耦合。

引起一个类变化的原因只有有一个。即每个类只能负责一个单独的职责,它应该仅仅关注自身自责的完成。

二、举例说明

1、例:有一个手机类,描述用手机打电话扣费,用一个类描述这件事。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Phone {
public void call(String number, String money) {
System.out.println("拨打电话:" + number + ",扣掉话费:" + money);
}
}

public class Client {
public static void main(String[] args){
Phone phone = new Phone();
phone.call("1XXXXXXX", "1元");
phone.call("2XXXXXXX", "2元");
}
}

2、 现在有个新问题,微信也能打电话,这个是走流量的。

在工作中,常用的有两种修改方法。

2.1 第一种:修改 call 方法,添加新参数(可选),并判断。

但是如果未来出现新的需求,还是需要修改,而且改动风险也大,弄不好会出现拨打电话:QQ号码,扣掉话费:5M这样的问题:

1
2
3
4
5
6
7
8
9
class Phone {
public void call(String number, String type, String money) {
if("wechat".equals(type)){
System.out.println("拨打微信:" + number + ",扣掉流量:" + money);
}else{
System.out.println("拨打电话:" + number + ",扣掉话费:" + money);
}
}
}

2.2 第二种:添加新的方法

1
2
3
4
5
6
7
8
9
class Phone {
public void call(String number, String money) {
System.out.println("拨打电话:" + number + ",扣掉话费:" + money);
}

public void callWechat(String number, String money) {
System.out.println("拨打微信:" + number + ",扣掉流量:" + money);
}
}

2.3 在根据单一职责来说,应该修改如下:

1
2
3
4
5
6
7
8
9
10
class NormalPhone {
public void call(String number, String money) {
System.out.println("拨打电话:" + number + ",扣掉话费:" + money);
}
}
class WechatPhone {
public void call(String number, String money) {
System.out.println("拨打微信:" + number + ",扣掉流量:" + money);
}
}

但是根据单一职责来划分的话,开销太大,所以实际工作中,添加新方法应该更好一点。

三、总结

  1. 单一职责原则比较简单,容易理解,但难于实际运用。
  2. 单一职责降低类的复杂度,但是会增加很多类。
  3. 单一职责提高了代码的可读性。