功能职责单一原则
错误代码示例:
Course 类承担了两种处理逻辑。假如现在要对课程进行加密,直播课程和录播课程的加密逻辑不一样,必须修改代码。而修改代码的逻辑势必会相互影响,容易带来不可控的风险。
public class Course {
public void study(String courseName){
if("直播课".equals(courseName)){
System.out.println(courseName + "不能快进");
}else{
System.out.println(courseName + "可以反复回看");
}
}
}
// 调用
public class SingleResponsibilityTest {
public static void main(String[] args) {
Course course = new Course();
course.study("直播课");
course.study("录播课");
}
}
我们对职责进行解耦,分别创建两个类:LiveCourse、ReplayCourse
public class LiveCourse {
public void study(String courseName){
System.out.println(courseName + "可以反复回看");
}
}
public class ReplayCourse {
public void study(String courseName){
System.out.println(courseName + "不能快进");
}
}
// 调用类
public class SingleResponsibilityTest {
public static void main(String[] args) {
LiveCourse liveCourse = new LiveCourse();
liveCourse.study("直播课");
ReplayCourse replayCourse = new ReplayCourse();
replayCourse.study("录播课");
}
}
接口层面职责单一原则
有问题的接口示例:
课程要做权限。没有付费的学员可以获取课程基本信息,已经付费的学员可以获得视频流,即学习权限。那么在控制课程层面上至少有两个职责。我们可以把展示职责和管理职责分离开来,都实现同一个抽象依赖。
public interface ICourse {
//获得基本信息
String getCourseName();
//获得视频流
byte[] getCourseVideo();
//学习课程
void studyCourse();
//退款
void refundCourse();
}
拆分成两个接口:
public interface ICourseInfo {
String getCourseName();
byte[] getCourseVideo();
}
public interface ICourseManager {
void studyCourse();
void refundCourse();
}
// 实现类
public class CourseImpl implements ICourseManager,ICourseInfo {
@Override
public void studyCourse() {
}
@Override
public void refundCourse() {
}
@Override
public String getCourseName() {
return null;
}
@Override
public byte[] getCourseVideo() {
return new byte[0];
}
}
方法层面职责单一原则
错误代码示例:
modifyUserInfo()方法承担了多个职责,既可以修改 userName,也可以修改 address,甚至更多,明显不符合单一职责。
public class Method {
private void modifyUserInfo(String userName,String address){
userName = "Tom";
address = "Changsha";
}
private void modifyUserInfo(String userName,String... fileds){
userName = "Tom";
// address = "Changsha";
}
private void modifyUserInfo(String userName,String address,boolean bool){
if(bool){
}else{
}
userName = "Tom";
address = "Changsha";
}
}
将这个方法拆分成两个方法:
private void modifyUserName(String userName){
userName = "Tom";
}
private void modifyAddress(String address){
address = "Changsha";
}