单一职责原则

4/8/2021 SRPDesignPrinciples

# 单一职责原则

单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。
定义:应该有且仅有一个原因引起类的变更。

原义:There should never be more than one reason for a class to change.

wiki (opens new window) 在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能, 并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。

# 示例

学生信息接口

public interface IStudentInfo {
    void setStudentName(String studentName);
    String getStudentName();
    void setStudentNo(String studentName);
    String getStudentNo();
    void setStudentClass(String studentClass);
    String getStudentClass();
    void setStudentGrade(String studentGrade);
    String getStudentGrade();
    boolean changePassword(String password);
    boolean deleteStudent();
    List<StudentInfo> studentList();
}
1
2
3
4
5
6
7
8
9
10
11
12
13

缺点:

  • 学生的属性和学生的行为没有分开

优化:

  • 信息抽取成一个BO(Business Object,业务对象)
  • 行为抽取成一个Biz(Business Logic,业务逻辑)

学生的属性接口
职责就是收集和反馈学生的属性信息

public class StudentBO extends StudentPro {
    public void setStudentName(String studentName) {
        // 业务逻辑
    }

    public String getStudentName() {
        // 业务逻辑
        return null;
    }

    public void setStudentNo(String studentName) {
        // 业务逻辑
    }

    public String getStudentNo() {
        // 业务逻辑
        return null;
    }

    public void setStudentClass(String studentClass) {
        // 业务逻辑
    }

    public String getStudentClass() {
        // 业务逻辑
        return null;
    }

    public void setStudentGrade(String studentGrade) {
        // 业务逻辑
    }

    public String getStudentGrade() {
        // 业务逻辑
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

学生的行为接口
完成学生信息的维护和变更

public class StudentBiz extends StudentPro {
    public boolean changePassword(String password) {
        // 业务逻辑
        return false;
    }

    public boolean deleteStudent(StudentInfo studentInfo) {
        // 业务逻辑
        return true;
    }

    public List<StudentInfo> studentList(StudentInfo studentInfo) {
        // 业务逻辑
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

职责分工

public class TestStudentMain {
    public static void main(String[] args) {
        StudentPro pro = new StudentPro();

        // 设置学生的属性,一个纯粹的BO
        StudentBO bo = (StudentBO) pro;
        bo.setStudentName("Goliv");

        // 执行业务动作,一个业务逻辑类
        StudentBiz biz = (StudentBiz) pro;
        biz.changePassword("3sSAa@asda213$asdas");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 优点

  • 类的复杂性降低,实现什么职责都有清晰明确的定义。
  • 可读性提高,复杂性降低,那当然可读性提高了。
  • 可维护性提高,可读性提高,那当然更容易维护了。
  • 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修 改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

# 注意

单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或 类设计得是否优良, 但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。

# 小故事

我们中华文明就有很多属于混合型的产物,比如筷子,我们可以把筷子当做刀来使用, 分割食物;还可以当叉使用,把食物从盘子中移动到口中。而在西方的文化中,刀就是刀,叉就是叉, 你去吃西餐的时候这两样肯定都是有的,刀就是切割食物,叉就是固定食物或者移动食物,分工很明晰。

对于单一职责原则,建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

# 案例

1

# 资料

# 示例代码

SRP (opens new window)


收录时间: 2021-04-08

最后更新时间: 10/11/2021, 3:33:08 PM