单一职责原则
- 一 官方定义
- 基本介绍
 
- 二 案例演示
- 普通方式实现
- 解决方案
 
- 解决方案一
- 解决方案
- 案例分析
 
- 解决方案二
- 解决方案
- 案例分析
 
- 案例总结
 
- 三 注意事项&细节
- 四 如何遵守单一职责原则?
一 官方定义
单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更
顾名思义:一个类只负责一项职责
基本介绍
即对类来说,一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2,当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2
 
二 案例演示
需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
普通方式实现
解决方案
/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        new Animal().runForest("老虎");
        new Animal().runForest("狮子");
        new Animal().runForest("老鹰");
    }
}
//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class Animal {
    //森林奔跑的方法
    public void runForest(String animal) {
        System.out.println(animal + "在森林里愉快的奔跑");
    }
}
案例分析
 
 语法上没有任何问题,但是在业务逻辑上有点不符合实际场景。老虎,狮子可以奔跑,老鹰应该是飞翔才对。这个run方法既有森林里奔跑的动物,又有天空中奔跑的动物,不仅违反了业务逻辑,又违反了单一职责。
解决方案一
拆分类,拆分类为更小的粒度
解决方案
- 职责分解,将Animal类的职责分解成ForestAnimal类和AirAnimal类
- 使用时分开使用对应的类
/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        //方案一
        new ForestAnimal().run("老虎");
        new ForestAnimal().run("狮子");
        new ForestAnimal().run("老狼");
        new AirAnimal().fly("老鹰");
    }
}
//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class ForestAnimal{
    public void run(String animal){
        System.out.println(animal + "在森林里愉快的奔跑");
    }
}
class AirAnimal{
    public void fly(String animal){
        System.out.println(animal + "在天空中愉快的飞翔");
    }
}
案例分析

 优势:符合了业务逻辑,符合单一职责原则
 劣势:改动幅度大,不光是要拆分类,客户端的代码也要进行大幅度的改动
解决方案二
直接在原来的类的基础上进行改动
解决方案
/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        new Animal().runForest("老虎");
        new Animal().runForest("狮子");
        new Animal().flyAir("老鹰");
    }
}
//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class Animal{
    //森林奔跑的方法
    public void runForest(String animal){
        System.out.println(animal + "在森林里愉快的奔跑");
    }
    //天空飞翔的方法
    public void flyAir(String animal){
        System.out.println(animal + "在天空里愉快的飞翔");
    }
}
案例分析

 优势:改动幅度下,包括客户端,完成了业务逻辑
 劣势:是否违反单一职责原则? (没有在类级别遵守单一职责,在方法级别的遵守)
案例总结
单一职责原则:各司其职
 通过上面两种方案分析:
 方案一:类级别遵守了单一职责原则,但是改动的代价很高
 方案二:方法级别遵守了单一职责原则,改动幅度较小
 综上所述,单一职责原则最核心的什么? 各司其职
三 注意事项&细节
- 降低类的复杂度,一个类只负责一项职责
一个类职责少了,相应的复杂度不就低了嘛
- 提高类的可读性以及可维护性
相应的复杂度降低了,代码量就会减少,可读性也就提高了,可维护性自然也就提高了
- 降低变更引起的风险
一个类职责越多,变更的可能性就会越大,变化带来的风险就会越大
- 通常情况下,我们应当遵守类级别单一职责原则
只有逻辑足够简单,才可以在代码中违反单一职责原则
四 如何遵守单一职责原则?
其实就是合理的职责分解,
 从业务出发,从需求出发,识别出同一个类型的职责
 需要说明一点:单一职责原则不是面向对象语言特有的,只要是模块化的程序设计,都要遵守单一职责原则









![[附源码]Nodejs计算机毕业设计教师业绩考核和职称评审系统Express(程序+LW)](https://img-blog.csdnimg.cn/d21daaa733bd450ba53ebb55fe0306bc.png)
![[附源码]Nodejs计算机毕业设计教务管理系统Express(程序+LW)](https://img-blog.csdnimg.cn/bdd7dc4dfd1d42c0be2c7586b6a6c623.png)








