设计模式6大原则之【单一职责原则】

单一职责原则定义

不要存在多于一个导致类变更的原因
或者可以定义为:就一个类而言,应该只有一个引起它变化的原因
一个类/接口/方法只负责一项职责

单一职责原则优点

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
  • 提高类的可读性。复杂性降低,自然其可读性会提高。
  • 提高系统的可维护性。可读性提高,那自然更容易维护了。
  • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

单一职责原则实现

一个违反单一职责的反例

有一个动物类(Animal),定义了动物移动的方法

public class Animal {
    public void Move(String name){
        System.out.println(name+"用脚走路");
    }
}

测试类进行测试

public static void main(String[] args) {
       Animal animal = new Animal();
    animal.Move("狗");
}

执行测试方法打印出 狗用脚走路
但是我们现在发现,鱼和鸟类也是动物,但是用脚走路是不对的,改如何解决呢?

修改动物类

public class Animal {
    public void Move(String name){
        if("鱼".equals(name)){
            System.out.println(name+"在水里游");
        }
        else if("鸟".equals(name)){
            System.out.println(name+"用翅膀飞");
        }else{
            System.out.println(name+"用脚走路");
        }
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.Move("狗");
        animal.Move("鱼");
        animal.Move("鸟");
    }
}

执行测试方法,打印

狗用脚走路
鱼在水里游
鸟用翅膀飞
我们发现如果这样修改花销是很大的,除了修改原来的类之外,还需要修改客户端。假如我们又新增了一种类型的动物,那么又得修改Move方法,这样是违反单一职责的

最佳实现

我们应该按照动物的类型将其分开,每种类只执行一种类型的方法

鱼类

public class AnimalFish {
    public void Move(){
        System.out.println("鱼类在水里游");
    }
}

鸟类

public class AnimalBird {
    public void Move(){
        System.out.println("鸟类用翅膀飞");
    }
}

陆地动物类

public class AnimalLand {
    public void Move(){
        System.out.println("陆地动物用脚走路");
    }
}

测试类

public static void main(String[] args) {
       AnimalBird animalBird = new AnimalBird();
      animalBird.Move();
      AnimalFish animalFish = new AnimalFish();
      animalFish.Move();
      AnimalLand animalLand = new AnimalLand();
      animalLand.Move();
  }

这样修改之后的有点显而易见了,如果要新增类型只需新增类即可,不会对原有类存在风险,并且降低了每个类的复杂性和可读性

原文地址:https://www.cnblogs.com/xiaoqingtian/p/13700892.html