zoukankan      html  css  js  c++  java
  • 设计模式七大原则——单一职责原则

    一、基本介绍

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

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

  • 相关阅读:
    有关try..catch..finally处理异常的总结
    java中finally和return的执行顺序
    慢查询处理
    阿里云数据库配置文件
    在DEV c++ 中如何设置默认的代码模板
    「C语言」单链表/双向链表的建立/遍历/插入/删除
    使用VS.NET2019做为C++开发专用IDE
    Windows下通过SSH无密码连接Linux服务器
    海沧区磁盘扩容思路办法
    Rabbitmq异常排查
  • 原文地址:https://www.cnblogs.com/yijiahao/p/14287866.html
Copyright © 2011-2022 走看看