单一职责又称单一功能原则,规定一个类应该只有一个发生变化的原因。职责指发生变化的原因,如果一个类有多个原因引起变化,那么后续迭代维护和拓展可能会带来很多麻烦。
以视频网站用户分类为例
简单地假设某个视频网站的用户分为访客用户、普通会员、VIP会员三类。
访客:只能观看480P高清,有广告;普通会员:可以观看720P超清,有广告;VIP会员:可以观看1080P蓝光,无广告。
简单地直接实现的方式:
public class VideoUserService {
public void serverGrade(String userType){
if("VIP会员".equals(userType)){
System.out.println("1080P蓝光");
}
else if("普通会员".equals(userType)){
System.out.println("720P超清");
}
else if ("访客用户".equals(userType)){
System.out.println("480P高清");
}
}
}
直接看上去好像没什么问题,但是这里的代码是简单的情况,如果考虑到复杂的业务逻辑,需要频繁迭代更新维护的话,那么就会麻烦很多。首先,如果用户类型很多的话,修改某类型用户的逻辑需要从长串的代码中找到对应的if分支然后修改。然后,如果整个系统要加上某个功能的话,每个if分支中需要加上自己特有的逻辑,出错的概率大大增加。
使用单一职责原则进行改造的话,需要将功能抽象出来作为接口,然后为不同类型的用户创建不同的类,实现接口的抽象方法。这样一来。将不同类型的用户拆分到不同的类中,每个类只关心实现具体的类型用户的功能,当业务逻辑复杂的时候能减小代码的复杂度,提升可读性,更重要的是在修改代码的时候只会修改当前类的逻辑,不会影响到其他类型的逻辑,减少了代码修改的风险。
使用单一职责改造
public interface IVideoUserService {
void definition();
void advertisement();
}
public class GuestVideoUserService implements IVideoUserService{
@Override
public void definition() {
System.out.println("访客用户,480P高清");
}
@Override
public void advertisement() {
System.out.println("访客用户,视频有广告");
}
}
public class OrdinaryVedioUserService implements IVideoUserService{
@Override
public void definition() {
System.out.println("普通会员,720P超清");
}
@Override
public void advertisement() {
System.out.println("普通会员,视频有广告");
}
}
public class VipVideoUserService implements IVideoUserService{
@Override
public void definition() {
System.out.println("VIP会员,1080P蓝光");
}
@Override
public void advertisement() {
System.out.println("VIP会员,视频去广告");
}
}
总结:单一职责的优点在于降低单个类的代码复杂度,提升可读性,降低代码维护出现问题的风险。
参考资料:《重学Java设计模式》