基本介绍:
对类来说,即一个类只负责一项职责。如类A 负责两个不同职责: 职责1,职责2。当职责1 需求变更而改变A时,可能会造成职责2执行错误,所以需要将类A的粒度分解成A1,A2
反例:
public class Vehicle {
public void run (String vehicle){
System.out.println(vehicle+"在公路上面跑");
}
}
public class SingleResponsibility1 {
//方式1 的run方法违反单一职责原则
//解决的方案非常简单,根据交通工具运行方式不同,分解不同类即可。
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机"); //wrong
}
}
正例:
public class RoadVehicle {
public void run(String vehicle){
System.out.println(vehicle+"在公路运行");
}
}
public class AirVehicle {
public void run(String vehicle){
System.out.println(vehicle+"在空中运行");
}
}
public class WaterVehicle {
public void run(String vehicle){
System.out.println(vehicle+"在水中运行");
}
}
public class SingleResponsibility2 {
//方式2 遵守了单一职责,但是这样的改动很大,即将类分解,同时修改客户端。
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("潜水艇");
}
}
改进:
public 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+"在水中运行");
}
}
public class SingleResponsibility3 {
//方式3 只是增加了方法。虽然没有类这个级别上遵守单一职责原则,但是在方法的级别上,仍然准备单一职责原则的。
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.runAir("飞机");
}
}
注意细节事项和细节:
-
降低类的复杂度,一个类只负责一项职责。
-
提高类的可读性,可维护性
-
降低变更引起的风险
-
通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级别上违反单一职责原则的;只有类中方法数量足够少,才可以在方法级别保持单一职责原则。