1.概述
所谓的职责就是类变化的原因,也就就实际的业务需求。如果一个类有多于一个原因别改变,那么这个类的职责就有超过两个及以上的规则。而单一职责约定一个类有且仅有一个改变类的原因。在实际开发中,例如在service层,userService就只负责对用户进行操作,商品就交给goodsService处理。
2.案例
2.1.描述
视频网站用户分类
2.2.代码
public class VideoService {
public void serveGrade(String userType){
if("游客".equals(userType)){
System.out.println(userType+" 标准");
}else if("普通".equals(userType)){
System.out.println(userType+" 720p");
}else if("vip".equals(userType)){
System.out.println(userType+" 1080P");
}
}
}
2.3.分析
当前类有多种不同的行为,也就是有多种职责,但是如果在当前类上扩展功能或添加逻辑,代码会变得臃肿。而且在改变一个功能也会影响其他逻辑,可能会带来不可控的风险。
2.4改善
实际开发中需要不断完善用户的权限,此时我们可以定义一个上层接口,定义基本的核心功能,针对不同的用户给出单独的实现。
public interface VideoService {
//描述
void describe();
//广告类型
void advertisement();
}
实现
public class Guest implements VideoService {
@Override
public void describe() {
System.out.println("游客 标准");
}
@Override
public void advertisement() {
System.out.println("有广告");
}
}
public class Ordinary implements VideoService {
@Override
public void describe() {
System.out.println("普通 480p");
}
@Override
public void advertisement() {
System.out.println("有广告");
}
}
public class VIP implements VideoService {
@Override
public void describe() {
System.out.println("VIP 1080P");
}
@Override
public void advertisement() {
System.out.println("可以跳过广告");
}
}
测试
public class Test {
public static void main(String[] args) {
VideoService user=new Guest();
user.describe();
user.advertisement();
VideoService user2=new Ordinary();
user2.describe();
user2.advertisement();
VideoService user3=new VIP();
user3.describe();
user3.advertisement();
}
}
综上,每个用户对应的职责都有对应的类来处理,每个类都只负责自己的哦用户行为。互不干扰。当某一类型的用户需要添加一种功能时,互不影响。例如,所有的付费用户可以点播(可以在vip类中单独实现,不影响其他用户)。
3.注意事项和细节
- 降低类的复杂度,一个类只负责一项职责。
- 提高类的可读性,可维护性
- 降低变更引起的风险