《设计模式之禅》笔记-单一职责原则

145 阅读2分钟

单一职责原则

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则

定义

一个类应该只有一种职责。

实例

示例1:

public class Vehicle {

    public void run(String name) {
        System.out.println(name + "在地上跑!");
    }
}

public class SingleResponsibility1 {

    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        vehicle.run("飞机");
        vehicle.run("汽车");
        vehicle.run("轮船");
    }
}

此上情况,违背了常识。不同的交通工具,有不同的运行方式。Vehicle中的run方法,没有满足单一职责的原则。导致出现了职责多样化,出现了错误。

示例2:

根据交通工具运行方式的不同区分成不同的类。处理上面的职责多样化的问题。

/**
 * 根据交通工具运行方式的不同区分成不同的类
 * @author Administrator
 */
public interface Vehicle {
    void run(String name);
}

public class RoadVehicle implements Vehicle{
    @Override
    public void run(String name) {
        System.out.println(name + "在地上跑!");
    }
}

public class AirVehicle implements Vehicle{
    @Override
    public void run(String name) {
        System.out.println(name + "在天上飞!");
    }
}

public class WaterVehicle implements Vehicle{
    @Override
    public void run(String name) {
        System.out.println(name + "在水里游!");
    }
}
此上情况,通过定义多个交通工具的实现类,满足不同的交通工具有各自独有的运行方式。满足了单一职责原则的设计。

优点:

  • 代码结果更加灵活
  • 可读性高,可维护性高 缺点:
  • 创建多个实现类,增加了内存的开销

示例3

不分解Vehicle类,直接修改Vehicle类中的方法即可

/**
 * 不分解Vehicle类,直接修改Vehicle类中的方法即可
 */
public class Vehicle {

    public void runRoad(String name) {
        System.out.println(name + "在地上跑!");
    }

    public void runAir(String name) {
        System.out.println(name + "在天上飞!");
    }

    public void runWater(String name) {
        System.out.println(name + "在水里游!");
    }
}

public class SingleResponsibility1 {

    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        vehicle.run("飞机");
        vehicle.run("汽车");
        vehicle.run("轮船");
    }
}
此上情况,通过在一个类中,添加不同交通工具的运行方法,满足了对应的交通工具有自己的运行方式。满足了单一职责原则的设计。

优点:

  • 只实例化一个类,减小了内存开销
  • 代码可读性高,可维护性高 缺点:
  • 扩展性不如第二种 注意事项和细节
  1. 降低类的复杂度,一个类只负责一项职责。
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常情况下,我们应当遵守单一职责原则
  • 只有逻辑足够简单,才可以在代码级违反单一职责原则;
  • 只有类中方法数量足够少,可以在方法级别保持单一职责原则