设计模式七大原则——单一职责原则
一、基本介绍
一个类应该只负责一项职责。
如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2
二、应用实例
以交通工具为案例进行讲解
1 public class SingleResponsibility1 { 2 public static void main(String[] args) { 3 Vehicle vehicle = new Vehicle(); 4 vehicle.run("飞机"); 5 vehicle.run("火车"); 6 vehicle.run("汽车"); 7 } 8 } 9 10 class Vehicle { 11 public void run(String name) { 12 System.out.println(name + "在地上跑!"); 13 } 14 }
运行结果:
第一行的输出结果就出现了一个违反常识的错误,在Vehicle类的run方法中违反了单一职责原则,飞机不属于陆地交通工具,因此导致run方法的职责多样化了,出现了上述错误
解决方案:根据交通工具运行方式的不同区分成不同的类即可
于是我们将Vehicle类分解成RoadVehicle、AirVehicle,WaterVehicle,分别代表在陆地,空中,水中的交通工具,得到下面的代码:
1 public class SingleResponsibility2 { 2 public static void main(String[] args) { 3 RoadVehicle roadVehicle = new RoadVehicle(); 4 roadVehicle.run("汽车"); 5 WaterVehicle waterVehicle = new WaterVehicle(); 6 waterVehicle.run("潜艇"); 7 AirVehicle airVehicle = new AirVehicle(); 8 airVehicle.run("飞机"); 9 } 10 } 11 12 class RoadVehicle { 13 public void run(String name) { 14 System.out.println(name + "在地上跑!"); 15 } 16 } 17 18 class AirVehicle { 19 public void run(String name) { 20 System.out.println(name + "在空中飞!"); 21 } 22 } 23 24 class WaterVehicle { 25 public void run(String name) { 26 System.out.println(name + "在水中游!"); 27 } 28 }
运行结果:
这样就符合我们的常识了,也遵循了单一职责原则,但是这种方式同样存在一些问题,将一个类分解为三个类的话代码改动较大,会增加系统内存的开销
解决方案:不分解Vehicle类,直接修改Vehicle类中的方法即可
于是我们根据交通工具不同的运行方式分别在Vehicle类中写出对应的方法,得到以下代码:
1 public class SingleResponsibility3 { 2 public static void main(String[] args) { 3 Vehicle2 vehicle = new Vehicle2(); 4 vehicle.runAir("飞机"); 5 vehicle.runRoad("火车"); 6 vehicle.runWater("潜艇"); 7 } 8 } 9 10 class Vehicle2 { 11 public void runRoad(String name) { 12 System.out.println(name + "在地上跑!"); 13 } 14 15 public void runAir(String name) { 16 System.out.println(name + "在空中飞!"); 17 } 18 19 public void runWater(String name) { 20 System.out.println(name + "在水里游!"); 21 } 22 }
运行结果:
运行结果跟刚才是一样的,但是这里没有实例化三个类的对象,只是实例化了一个类,调用了这个类中不同的方法,减小了系统内存开销的同时也遵循了单一职责原则,两全其美
三、注意事项和细节
-
降低类的复杂度,一个类只负责一项职责。
-
提高类的可读性,可维护性
-
降低变更引起的风险
-
通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则