设计模式六原则 - 单一职责原则

单一职责(Single Responsibility Principle, SRP)

一个类只负责一项职责,一个功能只负责一项职责。

  • 随着项目不停的迭代,复杂度的提升,一个类的功能越来越多,耦合度越来越高,一旦修改功能,可能导致其他功能正常运行,违背了单一职责原则。一个类只负责一项职责,每个类都是由一组相关性很高的函数变量组成,核心思想就是实现高内聚、低耦合。
  • 不要盲目的追求类的单一原则而导致代码类目变大,应该同时有平衡的追求类的单一原则和方法的单一原则。

  • 优点:

    • 降低类和方法的复杂度,一个类和一个方法只有一项职责,逻辑清楚明了;
    • 可维护性和可读性更高;
    • 变更引起的风险很低。改一处功能,其他地方影响很小;

问题

1
2
3
4
5
6
7
8
9
10
11
12
public class Animal {
public void eat(String animal){
System.out.println(animal + "吃树叶");
}
}
public class Main {
public static void main(String[] args){
Animal animal = new Animal();
animal.eat("马");
animal.eat("牛");
}
}

现在版本进行迭代,不只是需要吃树叶还需要吃肉。

解决1(类的单一职责)

将动物划分更细为食肉动物和食草动物。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Carnivores{
public void eat(String animal){
System.out.println(animal + "吃肉");
}
}
class GrassAnimal{
public void eat(String animal){
System.out.println(animal + "吃树叶");
}
}
public class Main {
public static void main(String[] args){
Carnivores carnivores = new Carnivores();
carnivores.eat("马");
GrassAnimal grassAnimal = new GrassAnimal();
grassAnimal.eat("牛");
}
}

解决2(方法的单一职责)

1
2
3
4
5
6
7
8
9
public class Animal {
public void eat(String animal){
System.out.println(animal + "吃树叶");
}

public void eat2(String animal){
System.out.println(animal + "吃肉");
}
}
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args){
Animal animal = new Animal();
animal.eat("马");
animal.eat2("牛");
}
}

本文的栗子很简单,只有一个方法,所以是方法1还是方法2都影响不大。实际情况中的类都要复杂很多,一旦发生职责扩散而需要修改类时,除非这个类非常简单,否则还是遵循单一职责原则。

六大设计原则:

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器