单一职责:不要存在一个以上导致类变更的原因。
咱们简单的描述一下,假设有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障,这个类就存在两个导致类变更的原因。
我们来看个例子,我们的课程有直播课和录播课,直播课不能快进和快退,录播课可以任意地反复观看,功能职责不一样。来我们来看一下代码:
package org.test.design.principle.srp;
public class Course {
public void study(String courseName) {
if ("直播课".equals(courseName)) {
System.out.println("不能快进");
} else {
System.out.println("可以任意地来回播放");
}
}
//测试调用
public static void main(String[] args) {
Course course = new Course();
course.study("直播课");
course.study("录播课");
}
}
我们来分析一下这部分代码,Course类承担了两个处理逻辑,如果,现在对课程进行加密,那么直播课和录播课的加密逻辑是不一样的,必须修改代码。而修改代码逻辑势必会相互影响,容易带来不可控的风险。我们对职责进行分离解耦,分别创建两个类LiveCourse和ReplayCourse。
LiveCourse.java
package org.test.design.principle.srp;
public class LiveCourse {
public void study(String courseName) {
System.out.println(courseName + "不能快进看");
}
}
ReplayCourse.java
package org.test.design.principle.srp;
public class ReplayCourse {
public void study(String courseName) {
System.out.println(courseName + "可以任意地来回播放");
}
}
创建测试调用:
package org.test.design.principle.srp;
public class SRPV2Test {
public static void main(String[] args) {
LiveCourse liveCourse=new LiveCourse();
liveCourse.study("直播课程");
ReplayCourse replayCourse=new ReplayCourse();
replayCourse.study("录播课");
}
}
代码在修改之后,开发起来简单,维护起来也容易。在实际项目中,代码会存在依赖、组合、耦合关系,在项目开发过程中还受到项目的规模、周期、技术人员水平、对进度的把控的影响,导致很多类都不能满足单一职责原则。但是,我们在编写代码的过程中,尽可能的让接口和方法保持单一职责,对项目后期的维护是有很大帮助的。