乐趣区

关于java:软件架构设计原则之单一职责原则

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

退出移动版