概述
定义:不要存在多于一个导致类变更的原因。通俗的说,一个类、接口、方法只负责一项职责。
例如:类A负责两个不同职责:职责1,职责2,当职责1需求变更而修改A时,可能造成职责2执行错误,所有需要将类A的粒度分解为A1,A2。
原则上说,我们设计一个类的时候不应该设计成大而全的类,要设计粒度小、功能单一的类,如果一个类有两个或两个以上的不相干的功能,那么我们就说它违背了单一职责原则,应该把它拆分成多个功能单一、粒度更细的类。
案例演示
以交通工具案例来分析
方案一:
package singleResponsibility.demo1;
public class SingleResponsibility {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
//飞机也在路上运行?不合理,轮船呢?
vehicle.run("飞机");
}
}
//交通工具类
//方案一:
//问题:run方法违反了单一职责原则
//改进:根据交通工具运行方式不同,分解为不同类
class Vehicle {
public void run(String vehicle) {
System.out.println(vehicle + " 在公路上运行...");
}
}
方案二:
package singleResponsibility.demo2;
public class SingleResponsibility {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("摩托车");
roadVehicle.run("汽车");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
WaterVehicle waterVehicle = new WaterVehicle();
waterVehicle.run("轮船");
}
}
//方案二:
//优点:遵守了单一职责原则
//问题:改动很大,类的细分可能导致类的数量暴增,同时需要修改客户端
//改进:直接修改Vehicle类,增加交通工具的运行方式
class RoadVehicle {
public void run(String vehicle) {
System.out.println(vehicle + " 在公路上运行...");
}
}
class AirVehicle {
public void run(String vehicle) {
System.out.println(vehicle + " 在天空运行...");
}
}
class WaterVehicle {
public void run(String vehicle) {
System.out.println(vehicle + " 在水中运行...");
}
}
方案三:
package singleResponsibility.demo3;
public class SingleResponsibility {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.runAir("飞机");
vehicle.runWater("轮船");
}
}
//方案三:
//优点:没有对原来的类做大的修改,只是增加方法,没有修改客户端代码,新增交通工具时调用新的运行方式即可
//虽然没有在类级别上遵守单一职责原则,但在方法级别上遵守了单一职责原则
class Vehicle {
public void run(String vehicle) {
System.out.println(vehicle + " 在公路上运行...");
}
public void runAir(String vehicle) {
System.out.println(vehicle + " 在天空运行...");
}
public void runWater(String vehicle) {
System.out.println(vehicle + " 在水中运行...");
}
}
单一职责原则的优点
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。优点:
- 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
- 提高类的可读性。复杂性降低,自然其可读性会提高。
- 提高系统的可维护性。可读性提高,那自然更容易维护了。
- 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
注意事项
单一职责不意味着一个类中只有一个方法。
通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则
适当地违背单一职责原则有时候反而能提高开发效率,因此设计原则还是要按照实际需求来选择使用的。