设计模式七大原则——单一职责原则

一、基本介绍

  一个类应该只负责一项职责。

  如类 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 }

  运行结果:

  

   运行结果跟刚才是一样的,但是这里没有实例化三个类的对象,只是实例化了一个类,调用了这个类中不同的方法,减小了系统内存开销的同时也遵循了单一职责原则,两全其美

三、注意事项和细节

  1. 降低类的复杂度,一个类只负责一项职责。

  2. 提高类的可读性,可维护性

  3. 降低变更引起的风险

  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

posted @ 2021-01-16 23:18  孤云jh  阅读(126)  评论(0编辑  收藏  举报