1.基本介绍
对类来说,即一个类应该只负责一项职责。如果类A负责两个不同的职责:职责1,职责2,当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2各自负责职责1和职责2
2.应用案例
比如不同的交通工具的运行方式:汽车运行在公路上,飞机在空中运行,轮船在水中运行案例
-
方式1:设计一个交通工具类,使用不同的交通工具运行
public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle =new Vehicle(); vehicle.run("汽车"); vehicle.run("飞机"); vehicle.run("轮船"); } } class Vehicle{ public void run(String vehicle){ System.out.println(vehicle+"在公路上运行...."); } }
运行结果:
汽车在公路上运行.... 飞机在公路上运行.... 轮船在公路上运行....
由运行结果可知:
1、飞机和轮船不应该在公路上运行,在run方法中,违反了单一职责原则
2、解决方案:根据不同的交通工具运行方法不同,分解成不同的类 -
不同交通工具运行方法分解成不同的类
public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("汽车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); WaterVehicle waterVehicle = new WaterVehicle(); waterVehicle.run("轮船"); } } 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 + " 在水中运行...."); } }
运行结果:
汽车 在公路上运行.... 飞机 在天空中运行.... 轮船 在水中运行....
由运行结果可知:
1、不同的交通工具采用了不同的运行方式,遵守了单一职责原则
2、但是这样做的改动很大,即将类分类,同时修改客户端
3、改进方法:在方法1的基础上直接修改Vehicle类,改动的代码会比较少 -
不同交通工具运行方法在同一类采用不同方法运行
public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle =new Vehicle2(); vehicle.run("汽车"); vehicle.runAir("飞机"); vehicle.runWater("轮船"); } } class Vehicle2{ 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+" 在水中运行...."); } }
运行结果:
汽车 在公路上运行.... 飞机 在天空中运行.... 轮船 在水中运行....
由运行结果可知:
1、这种修改方法没有对原来的类做很大的修改,只是增加了方法,根据不同的实现方式调用不同的方法
2、虽然没有在类级别上遵守单一职责原则,但是在方法级别上,仍然遵守单一职责
由以上的案例得知为什么要遵守单一职责原则?
比如公路上运行的汽车增加对尾号限行的需求,我们只需要修改负责在公路上运行的汽车的功能即可,无需修改在天空中或水中运行的方法,这样修改完成后只需要测试修改过公路运行的方法即可,降低变更引起的风险。
3.注意事项和细节
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下:应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则