定义
- Do one things,and do it well.
- 一个类、接口、方法只负责一项职责。
代码理解
这个原则其实很简单,就是一个类、接口、方法只负责一项职责。
场景
比如我们日常生活中的紧急呼叫 报警:110,火警电话:119,急救电话:120 。下面让我们用JAVA实现一下这个场景。
错误实现
定义一个 紧急呼叫的类。其中有呼叫的方法,根据呼叫的电话号码来判断呼叫的类型。
/**
* @ClassName EmergencyCall
* @Description 紧急呼叫类
* @Author Neal
* @Date 2019/2/28 15:37
* @Version 1.0
*/
public class EmergencyCall {
/**
* 拨打紧急电话
* @param type
*/
public void call(int phoneNum) {
if(phoneNum == 110) {
System.out.println("拨打报警电话");
}else if(phoneNum == 120) {
System.out.println("拨打火警电话");
}else if(phoneNum == 119) {
System.out.println("拨打急救电话");
}else{
System.out.println("未知呼叫");
}
}
}
这种方式虽然一个方法实现了所有的场景要求,但是有一个弊端,如果我们出国,那么紧急呼叫必然不是这些电话,所以我们要新增呼叫电话和类型,这样有可能会影响或者与之前的呼叫类型冲突,所以我们就需要遵循单一职责原则。
单一职责
1.定义紧急呼叫接口
/**
* @InterfaceName ICall
* @Description 呼叫接口
* @Author Neal
* @Date 2019/2/28 16:28
* @Version 1.0
*/
public interface ICall {
void call();
}
2.单独的报警类以及单独的火警类
/**
* @ClassName CallPolice
* @Description 报警
* @Author Neal
* @Date 2019/2/28 16:29
* @Version 1.0
*/
public class CallPolice implements ICall {
public void call() {
System.out.println("拨打报警电话");
}
}
/**
* @ClassName CallFireBrigade
* @Description 火警
* @Author Neal
* @Date 2019/2/28 16:31
* @Version 1.0
*/
public class CallFireBrigade implements ICall {
public void call() {
System.out.println("拨打火警电话");
}
}
这种就是单一职责原则的一种实现,这种实现虽然创建了很多类,但是每个类单独负责一个职责,如果要在火警中增加灭火方法。那么只需要找到火警的类,去修改其方法就可以了。 对其他的类和方法没有任何影响。但是在第一种错误实现时,就会有影响,因为他影响了原有类的结构,万一调用错误,在报完急救之后吴调用灭火方法,那就太尴尬了。
总结
其实在我们正常的WEB项目开发中,基本的单一职责就是 分controller,service,dao层,这就是一种体现,当然有时候我们在接到需求的时候,由于要修改太多东西,可能不会去考虑这一原则的具体实施。
网友评论