基本概念:

       对于一个类来说一个类应该只负责一项职责。

单一职责要做的事:


  1. 降低类的复杂度,一个类只负责一项职责
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险

另外注意:

        当逻辑足够简单时,才可以在代码级别违反单一职责原则;

        当类中方法数量足够少,可以在方法级别上保持单一职责原则,否则当准守类单一职责原则(将职责拆分为多个类)


举例:主类  运行各种交通工具

public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } }

方式一、没有准守 单一职责原则

// 交通工具类 // 方式1 // 1. 在方式1 的run方法中,违反了单一职责原则 // 2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可 class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上运行...."); } }

输出: 这里可以发现  飞机 在公路上运行....这里是不对的!

单一职责原则(拆分职责)_单一职责

Vehicle类在这里的职责太过宽泛了,不同交通工具应当走不同的路。所以这里Vehicle类没有准守单一职责原则。

因此应当修改。



 方式二、用类拆分职责,将职责分担给不同的类

//方案2的分析 //1. 遵守单一职责原则 //2. 但是这样做的改动很大,即将类分解,同时修改客户端 //3. 改进:直接修改Vehicle 类,改动的代码会比较少=>方案3 class RoadVehicle { public void run(String vehicle) { System.out.println(vehicle + "公路运行"); } } class AirVehicle { public void run(String vehicle) { System.out.println(vehicle + "天空运行"); } } class WaterVehicle { public void run(String vehicle) { System.out.println(vehicle + "水中运行"); } }

此时主类需要做一点点改动

public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托车"); roadVehicle.run("汽车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); } }

 单一职责原则(拆分职责)_客户端_02

这时就准守了单一职责原则



方式三、在方法级别上准守单一职责,但是在类上没有准守单一职责。因为这个类的功能足够简单

注意:这里不要用if...else if...else...类将职责区分,因为这种方式的耦合性很高

//方式3的分析 //1. 这种修改方法没有对原来的类做大的修改,只是增加方法 //2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责 class Vehicle2 { public void run(String vehicle) { System.out.println(vehicle + " 在公路上运行...."); } public void runAir(String vehicle) { System.out.println(vehicle + " 在天空上运行...."); } public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行...."); } }

主类也需要一点改动

public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽车"); vehicle2.runWater("轮船"); vehicle2.runAir("飞机"); } }

单一职责原则(拆分职责)_客户端_03