繁多职责(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弹架构”,回复“材料”、“简历”、“刷题”,“招聘”即可支付面试真题,简历模板等!