-
繁多职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的起因。假如咱们有一个类负责两个职责,一旦产生需要变更,批改其中一个职责的逻辑代码,有可能导致另一个职责的性能产生故障。这样一来,这个类就存在两个导致类变更的起因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。前期需要变更保护互不影响。这样的设计,能够升高类的复杂度,进步类的可读性,进步零碎的可维护性,升高变更引起的危险。总体来说,就是一个类、接口或办法只负责一项职责。
接下来,咱们来看代码实例,还是用课程举例,咱们的课程有直播课和录播课。直播课不能快进和快退,录播课程能够任意地重复观看,性能职责不一样。还是先创立一个 Course 类:
public class Course {public void study(String courseName){if("直播课".equals(courseName)){System.out.println(courseName + "不能快进");
}else{System.out.println(courseName + "能够重复回看");
}
}
}
看调用代码:
public static void main(String[] args) {Course course = new Course();
course.study("直播课");
course.study("录播课");
}
从下面的代码来看,Course 类承当了两种解决逻辑。如果当初要对课程进行加密,直播课程和录播课程的加密逻辑不一样,必须批改代码。而批改代码的逻辑势必会相互影响,容易带来不可控的危险。咱们对职责进行解耦,来看代码,别离创立两个类:LiveCourse 和 ReplayCourse。
LiveCourse 类的代码如下:
public class LiveCourse {public void study(String courseName){System.out.println(courseName + "不能快进看");
}
}
ReplayCourse 类的代码如下:public class ReplayCourse {public void study(String courseName){System.out.println(courseName + "能够重复回");
}
}
调用代码如下:
public static void main(String[] args) {LiveCourse liveCourse = new LiveCourse();
liveCourse.study("直播课");
ReplayCourse replayCourse = new ReplayCourse();
replayCourse.study("录播课");
}
业务持续倒退,课程要做权限。没有付费的学员能够获取课程根本信息,曾经付费的学员能够取得视频流,即学习权限。那么在管制课程层面上至多有两个职责。咱们能够把展现职责和治理职责拆散开来,都实现同一个形象依赖。设计一个顶层接口,创立 ICourse 接口:
public interface ICourse {
// 取得根本信息
String getCourseName();
// 取得视频流
byte[] getCourseVideo();
// 学习课程
void studyCourse();
// 退款
void refundCourse();}
咱们能够把这个接口拆成两个接口:ICourseInfo 和 ICourseManager。
ICourseInfo 接口的代码如下:
public interface ICourseInfo {String getCourseName();
byte[] getCourseVideo();
}
ICourseManager 接口的代码如下:
public interface ICourseManager {void studyCourse();
void refundCourse();}
来看一下类图,如下图所示。
上面咱们来看一下办法层面的繁多职责设计。有时候咱们会偷懒,把一个办法写成上面这样:
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";
}
显然,下面的 modifyUserInfo() 办法承当了多个职责,既能够批改 userName,也能够批改 address,甚至更多,显著不合乎繁多职责。咱们做如下批改,把这个办法拆成两个办法:
private void modifyUserName(String userName){userName = "Tom";}
private void modifyAddress(String address){address = "Changsha";}
批改之后,开发起来简略,保护起来也容易。咱们在理论开发中会有我的项目依赖、组合、聚合这些关系,还有我的项目的规模、周期、技术人员的程度、对进度的把控,很多类都不合乎繁多职责。然而,咱们在编写代码的过程,尽可能地让接口和办法放弃繁多职责,对我的项目前期的保护是有很大帮忙的。
小测一下
本文为原创文章,转载请注明出处!关注微信公众号“Tom 弹架构”,回复“材料”、“简历”、“刷题”,“招聘”即可支付面试真题,简历模板等!