定义:

应该有且仅有一个原因引起类的变更(There should never be more than one reason for a class to change)
单一职责原则为我们提供了一个编写程序的准则,要求我们在编写类,抽象类,接口时,要使其功能职责单一纯碎,将导致其变更的因素缩减到最少。
如果一个类承担的职责过多,就等于把这些职责耦合在一起。一个职责的变化可能会影响或损坏其他职责的功能。而且职责越多,这个类变化的几率就会越大,类的稳定性就会越低。
在软件开发中,经常会遇到一个功能类T负责两个不同的职责:职责P1,职责P2。现因需求变更需要更改职责P1来满足新的业务需求,当我们实现完成后,发现因更改职责P1竟导致原本能够正常运行的职责P2发生故障。而修复职责P2又不得不更改职责P1的逻辑,这便是因为功能类T的职责不够单一,职责P1与职责P2耦合在一起导致的。

1.错误示范

  1. package com.kris.designmode.principle.singleresponsibility;
  2. public class SingleResponsibility {
  3. public static void main(String[] args) {
  4. Vehicle vehicle = new Vehicle();
  5. vehicle.run("摩托车");
  6. vehicle.run("汽车");
  7. vehicle.run("飞机");
  8. }
  9. }
  10. /**
  11. * 交通工具
  12. * 方式1
  13. * 1.在方式一的run方法中,违反了单一职责原则
  14. * 2.解决方案非常简单,根据交通工具运行方式不同,分解成不同的类
  15. */
  16. class Vehicle{
  17. public void run(String vehicle){
  18. System.out.println(vehicle+" 在公路上跑。。。。");
  19. }
  20. }

2.改进1-类级别单一职责

  1. package com.kris.designmode.principle.singleresponsibility;
  2. public class SingleResponsibility02 {
  3. public static void main(String[] args) {
  4. RoadVehicle roadVehicle = new RoadVehicle();
  5. roadVehicle.run("汽车");
  6. AirVehicle airVehicle = new AirVehicle();
  7. airVehicle.run("飞机");
  8. WaterVehicle waterVehicle = new WaterVehicle();
  9. waterVehicle.run("轮船");
  10. }
  11. }
  12. /**
  13. * 方案2分析
  14. * 1.遵守单一职责原则
  15. * 2.但是这样改动大,既将类分解,又要改动客户端
  16. * 3.改进:直接修改Vehicle类,改动代码会比较少
  17. */
  18. class RoadVehicle{
  19. public void run(String vehicle){
  20. System.out.println(vehicle+"在公路运行");
  21. }
  22. }
  23. class AirVehicle{
  24. public void run(String vehicle){
  25. System.out.println(vehicle+"在天空运行");
  26. }
  27. }
  28. class WaterVehicle{
  29. public void run(String vehicle){
  30. System.out.println(vehicle+"在水中运行");
  31. }
  32. }

3.改进2-方法级别单一职责

  1. package com.kris.designmode.principle.singleresponsibility;
  2. public class SingleResponsibility03 {
  3. public static void main(String[] args) {
  4. Vehicle2 vehicle2 = new Vehicle2();
  5. vehicle2.run("汽车");
  6. vehicle2.runWater("轮船");
  7. vehicle2.runAir("飞机");
  8. }
  9. }
  10. /**
  11. * 方式3分析
  12. * 1.这种修改方法没有对原来的类做大的修改,只是增加方法
  13. * 2.虽然没有在类级别遵守单一职责原则,但是在方法级别仍然是遵守单一职责原则
  14. * 3.如果类里面不止run还有其他很多功能,那需要拆分成类级别的单一职责原则
  15. */
  16. class Vehicle2{
  17. public void run(String vehicle){
  18. System.out.println(vehicle+"在公路运行");
  19. }
  20. public void runAir(String vehicle){
  21. System.out.println(vehicle+"在天空运行");
  22. }
  23. public void runWater(String vehicle){
  24. System.out.println(vehicle+"在水中运行");
  25. }
  26. }

4.总结

image.png