一个类或者模块只负责完成一个职责(或者功能)
导致某个模块变更的原因只能有一个
细分接口,具体实现通过接口可以多继承的方式来
按业务模块仔细拆分
尽量一个方法只做一个事情,不写大方法,复杂逻辑拆分成具体的小方法方便复用
思考一:如何判断职责是否单一?
感觉这个和具体的业务有关系,业务不是一步发展到位的,需求也不是不改的,只能按照粗粒度的先弄一个类,后期再进行重构了。
思考二:职责是否越单一越好?
都知道职责拆分越单一,内聚越强,但是如果内聚过强了,比如说把用来序列化相关的一个类拆分成两个类,是不是耦合度又上去了,而且后期维护的时候也难了(比如两个类有共同的模块,改了一个地方还得改另外一个地方)。
本例中如果后期有新的类型的课程,可以再定义一个新的类
将 Course 按照类型进行了细分,后期如果有别的课程,可以通过新建类的方式实现。
/**
* 课程
*
* @author mindartisan.blog.csdn.net
* @date
*/
public class Course {
public void learn(String courseType) {
if ("直播课".equals(courseType)) {
System.out.println(courseType + " -> 不能快进");
} else {
System.out.println(courseType + " -> 想怎么看怎么看");
}
}
}
/**
* 直播课
*
* @author mindartisan.blog.csdn.net
* @date
*/
public class LiveCourse {
public void learn(String courseType) {
if ("直播课".equals(courseType)) {
System.out.println(courseType + " -> 不能快进");
}
}
}
/**
* 录屏课
*
* @author mindartisan.blog.csdn.net
* @date
*/
public class RecordCourse {
public void learn(String courseType) {
if("录屏课".equals(courseType)){
System.out.println(courseType + " -> 想怎么看怎么看");
}
}
}
/**
* 单一职责测试
*
* @author mindartisan.blog.csdn.net
* @date
*/
public class SingleResponsibilityTest {
public static void main(String[] args) {
Course course = new Course();
course.learn("直播课");
course.learn("录屏课");
LiveCourse liveCourse = new LiveCourse();
liveCourse.learn("直播课");
RecordCourse recordCourse = new RecordCourse();
recordCourse.learn("录屏课");
}
}
将方法细分。下例中通过将课程接口中的方法依据是否需要购买分成了付费课程和免费课程,方便后期业务功能扩展。
/**
* 课程接口
*
* @author mindartisan.blog.csdn.net
* @date
*/
public interface ICourse {
/**
* 获取课程名称
*
* @return {@link String}
*/
String getCourseName();
/**
* 获取课程视频流
*
* @return {@link byte[]}
*/
byte[] getCourseVideoFlow();
/**
* 学习课程
*/
void studyCourse();
/**
* 退款课程
*/
void refundCourse();
}
/**
* 免费课程
*
* @author mindartisan.blog.csdn.net
* @date
*/
public interface FreeCourse {
/**
* 获取课程名称
*
* @return {@link String}
*/
String getCourseName();
}
/**
* 付费课程
*
* @author mindartisan.blog.csdn.net
* @date
*/
public interface PayCourse {
/**
* 获取课程视频流
*
* @return {@link byte[]}
*/
byte[] getCourseVideoFlow();
/**
* 学习课程
*/
void studyCourse();
/**
* 退款课程
*/
void refundCourse();
}
public class CourseImpl implements FreeCourse,PayCourse{
@Override
public String getCourseName() {
return null;
}
@Override
public byte[] getCourseVideoFlow() {
return new byte[0];
}
@Override
public void studyCourse() {
}
@Override
public void refundCourse() {
}
}