设计模式:单一职责原则

官方定义

单一职责原则(Single Responsibility Principe SRP)有且仅有一个原因引起类的变更

顾名思义:一个类只负责一项职责

基本介绍

即对类来说,一个类应该值负责一项职责。如果类A负责两个不同职责:职责1,职责2,当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的力度分解为A1,A2

案例:动物世界

需求:有一个动物类,里面定义了一个在深林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作

public class SingleDemo{
    
   public static void main(String[] args){
       new Animal().run("老虎");
       new Animal().run("狮子");
       new Animal().run("老鹰");
   }
}

class Animal{
    //森林奔跑的方法
    public void run(String aniaml){
        System.out.println(animal+"在森林里愉快的奔跑");
    }
}

很明显老鹰在森林里愉快的奔跑是比较奇怪的

解决方案一

拆分类、拆分类为更小的粒度

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 + "在天空愉快的飞翔");
    }
}

方案一分析

优势:符合了业务逻辑,符合了单一职责原则

劣势:改动幅度大,不光拆分类,客户端的代码也要进行大幅度的改动

解决方案二

直接在原来的类的基础上进行改动

public class SingleDemo{
    
   public static void main(String[] args){
       new Animal().run("老虎");
       new Animal().run("狮子");
       new Animal().fly("老鹰");
   }
}

class Animal{
    //森林奔跑的方法
    public void run(String aniaml){
        System.out.println(animal+"在森林里愉快的奔跑");
    }
    //天空飞翔的方法
     public void fly(String animal){
        System.out.println(animal + "在天空愉快的飞翔");
    }   
    
}

方案二分析

优势:改动幅度小,包括客户端,完成了业务逻辑

劣势:是否违反了单一职责原则?(方法级别的遵守)

单一职责原则:各司其职

通过上面两种,大家可以看到,方案一,类级别遵守了单一职责原则,但是改动的带价很大

方案二,方法级别遵守了单一职责原则,改动幅度较小

综上所述,单一职责原则最核心的是什么? 各司其职

注意事项&细节

  • 降低类的复杂度,一个类只负责一项职责
    • 一个类职责少了,相应的负责度不就低了嘛
  • 提高类的可读性已经可维护性
    • 相应的复杂度降低了,代码量就会减少,可读性也就提高了,可维护性自然也就提高了
  • 降低变更引起的风险
    • 一个类的职责越多,变更的可能性就越大,变化带来的风险也就会越大
  • 通常情况下,我们应当遵守类级别单一职责原则
    • 只有逻辑足够简单,才可以在代码中违反单一职责原则

如何遵守单一职责原则

其实就是合理的职责分解

从业务出发,从需求出发,识别出同一个类型的职责

需要说明一点,单一职责原则不是面向对象语言特有的,只有是模块化的程序设计,都要遵守单一职责原则。

posted @ 2021-01-21 22:18  吕敬瑛  阅读(134)  评论(0编辑  收藏  举报