单一职责原则定义
不要存在多于一个导致类变更的原因
或者可以定义为:就一个类而言,应该只有一个引起它变化的原因
一个类/接口/方法只负责一项职责
单一职责原则优点
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。
- 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
- 提高类的可读性。复杂性降低,自然其可读性会提高。
- 提高系统的可维护性。可读性提高,那自然更容易维护了。
- 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
单一职责原则实现
一个违反单一职责的反例
有一个动物类(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();
}
这样修改之后的有点显而易见了,如果要新增类型只需新增类即可,不会对原有类存在风险,并且降低了每个类的复杂性和可读性