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