引言
本文参考以下这篇文章
https://blog.csdn.net/guorui_java/article/details/125947300
定义
单一职责原则(Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。
它规定一个类/函数/模块应该只有一个发生变化的原因。
该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式与实践》一书中给出的。
马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。
所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
反例
public class UserService {
// 读文章
public void read(String userType) {
if(AppConfig.USER_GENERAL.equals(userType)) {
System.out.println("可以查阅哪吒的普通文章");
} else if(AppConfig.USER_EXCLUSIVE.equals(userType)) {
System.out.println("可以查阅哪吒的Java基础教程系列文章");
} else if(AppConfig.USER_VIP.equals(userType)) {
System.out.println("可以查阅哪吒的全部优质文章,告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美");
}
}
// 发福利
public void sendPresents(String userType) {
// 对VIP用户发福利
if(AppConfig.USER_VIP.equals(userType)) {
// TODO 发福利
}
}
}
正例
public interface IUserService {
void read();
void sendPresents();
}
public class GeneralUserServiceImpl implements IUserService {
public void read() {
// TODO
}
public void sendPresents() {
// TODO
}
}
个人总结
根据上面的代码进行分析:
用户可以是多种类型的,行为可以是多种类型的,因此应该是一种多对多的关系;
而上述代码在一个行为(read)中涉及到了多种用户类型(general | exclusive | vip)
即强制将一个行为和多种数据类型进行绑定,将多对多的关系表示为一对多的关系,是不合理的;
修改后的代码:
不同类型的用户可以各自定义不同种类的行为,仍然保持逻辑上的多对多的关系,是合理的;
如果添加用户类型,则只需要新建xxxUserServiceImpl实现IUserService接口即可
如果添加用户行为,则可以在IUserService中添加或者单独给某个用户添加某种行为即可
补充
如果有多个实现类的某个行为是一致的,可以通过抽象类来提取公共方法
public interface IUserService {
void read();
void sendPresents();
}
public abstract class UserServiceImpl implements IUserService{
public void read() {
System.out.println("这是公共的读");
}
public void sendPresents() {
System.out.println("这是公共的发福利");
}
}
public class GeneralUserServiceImpl extends UserServiceImpl {
public void read() {
System.out.println("这是自定义的读");
}
// 如果不重写这个方法,则使用抽象类的方法
// public void sendPresents() {
// System.out.println("这是自定义的写");
// }
}
public class MainApplication {
public static void main(String[] args) {
GeneralUserServiceImpl userService = new GeneralUserServiceImpl();
userService.read();
userService.sendPresents();
}
}
参考文档
普通类和抽象类的区别_LIT-涛的博客-CSDN博客_抽象类和普通类的区别