单一职责原则介绍:
对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。
当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为 A1,A2
以交通工具为案例
方案一:
package com.kittenplus.principle.singleresponsibility; /* * 方案一:没有遵守单一职责原则 */ public class SingleResponsibility1 { public static void main(String[] args) { // TODO Auto-generated method stub Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } } //交通工具类 //1.在方法一的run方法中,违反了单一职责原则 //2.解决方案:根据交通工具运行方式不同,分解成不同的类 class Vehicle { public void run(String vehicle) { System.out.println(vehicle+"一辆小汽车在公路上跑"); } }
方案二:
package com.kittenplus.principle.singleresponsibility; /* * 方案二:遵守了单一原则,但是改动很大。即要将类分解,同时要修改客户端。 * 改进:直接修改Vehicle类,改动的代码会比较少。 */ public class SingleResponsibility2 { public static void main(String[] args) { // TODO Auto-generated method stub RoadVehicle rv = new RoadVehicle(); rv.run("摩托车"); rv.run("汽车"); AriVehicle av = new AriVehicle(); av.run("飞机"); WaterVehicle wv = new WaterVehicle(); wv.run("轮船"); } } class RoadVehicle { public void run(String vehicle) { System.out.println(vehicle + "在公路运行"); } } class AriVehicle{ public void run(String vehicle) { System.out.println(vehicle + "在公路运行"); } } class WaterVehicle{ public void run(String vehicle) { System.out.println(vehicle + "在水里运行"); } }
方案三:
package com.kittenplus.principle.singleresponsibility; /* *方式三: *1.这种修改的方法没有对原来的类进行较大的改动,只是增加了方法 *2.这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责。 */ public class SingleResponsibility3 { public static void main(String[] args) { // TODO Auto-generated method stub Vehicle2 v2 = new Vehicle2(); v2.Roadrun("马达飞"); v2.Airrun("精英飞机"); v2.Waterrun("水中游"); } } class Vehicle2 { public void Roadrun(String vehicle) { System.out.println(vehicle+" 一辆小汽车在公路上跑"); } public void Airrun(String vehicle) { System.out.println(vehicle+" 飞机在公路上飞"); } public void Waterrun(String vehicle) { System.out.println(vehicle+" 轮船在水中跑"); } }
单一职责原则注意事项和细节
1) 降低类的复杂度,一个类只负责一项职责。
2) 提高类的可读性,可维护性
3) 降低变更引起的风险
4) 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违
反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则