定义:

不要存在多余一个导致类变更的原因.一个类、接口、之负责一项职责.

优点:

降低类的复杂度;
提高类的的可读性;
提高系统的可维护性;
降低变更引起的风险;

实践代码:

这次偷个懒没有手敲,直接粘贴别人的.假设有现在有一个课程,分为直播和录播,各自具有不同的特性
public class Course {
    public  void study(String courseName){
        if("直播课".equals(courseName)){
            System.out.println("不能快进");
        }else{
            System.out.println("可以任意的来回播放");
        }
    }
}

public class LiveCourse {
    public  void  study(String courseName){
        System.out.println("不能快进");
    }
}

public class ReplayCourse {
    public  void  study(String courseName){
        System.out.println("可以任意的来回播放");
    }
}
具体化为一个ICourse接口,具有获得课程名,获得视频资源,学习课程 ,退订课程的功能,实现类CourseImpl来进行具体实现.
public interface ICourse {

    String getCourseName();
    byte[] getCourseVideo();

    void studyCourse();
    void refundCourse();
}

public class CourseImpl implements ICourse {
    public String getCourseName() {
        return null;
    }

    public byte[] getCourseVideo() {
        return new byte[0];
    }

    public void studyCourse() {

    }

    public void refundCourse() {

    }
}

类图:

mark
从上面代码和类图可以看出 ICourse的职责过多,并不符合单一接口原则,我们可以拆分细化为两个接口,一个负责课程展示职责,一个负责课程的处理职责.

改造后的代码:

public interface ICourseInfo {
    String getCourseName();
    byte[] getCourseVideo();
}

public interface ICourseManager {

    void studyCourse();
    void refundCourse();
}

public class CourseImpl implements ICourseInfo,ICourseManager {
    public String getCourseName() {
        return null;
    }

    public byte[] getCourseVideo() {
        return new byte[0];
    }

    public void studyCourse() {

    }

    public void refundCourse() {

    }
}

改造后的类图:

mark
单一接口原则主要是要求在实际开发中尽量将职责细化分开,不要让一个接口承担过多,或者一个方法里面实现多个功能(如一个修改用户的name和修改用户的地址,修改用户的其他信息,放到一个方法里面去判断标记,然后写流程),有利于后期的代码维护.