原始需求:设计一个动物类,实现他移动方法
class Animal {
/**
* 移动
* @param animalType 动物类型
*/
public void move(String animalType) {
System.out.printf(animalType + "在路上跑");
}
}
需求变更:实现鸟、鱼的移动方法
//写法一
class Animal {
/**
* 移动
* @param animalType 动物类型
*/
public void move(String animalType) {
if ("鸟".equals(animalType)) {
System.out.printf(animalType + "在天上飞");
} else if ("鱼".equals(animalType)) {
System.out.printf(animalType + "在水里游");
} else if ("老虎".equals(animalType)) {
System.out.printf(animalType + "在路上跑");
}
}
}
写法一:违反了单一职责原则,代码很臃肿,降低了代码的可读性、可维护性。假如将来某一天,我们需要修改鸟的移动方法。存在的风险是可能影响到老虎、鱼的移动方法。
//写法二
class Animal {
public void birdMove() {
System.out.printf("鸟在天上飞");
}
public void tigerMove() {
System.out.printf("老虎在路上跑");
}
public void fishMove() {
System.out.printf("鱼在水里游");
}
}
写法二:在方法级别上遵守的单一职责原则,在逻辑足够简单,类中方法少的情况下可使用。需求变更不会影响到其他方法。
//写法三
class Bird{
public void move() {
System.out.printf("鸟在天上飞");
}
}
class Tiger{
public void move() {
System.out.printf("老虎在路上跑");
}
}
class Fish{
public void move() {
System.out.printf("鱼在水里游");
}
}
方式三:将类分解,完全遵守单一职责原则,但是这样的修改成本过高,类分解的过多,改动的地方也比较多。在实际情况中还需综合考虑使用
单一职责原则的注意事项
- 降低类的复杂度,一个类只负责维护一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,应该遵守单一职责原则,只有逻辑足够的简单,才可在代码级违反单一职责原则,类中的方法足够的少,可以在方法级别上保持单一职责原则。