单一职责原则
对类来说,一个类应该只负责一项职责,如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
这里的职责是指类变化的原因。单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。
该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在两个缺点:
1.一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
2.当客户端需要该对象某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。
单一职责原则的核心:控制类的粒度大小、将对象解耦、提高其内聚性。
单一职责同样也适用于方法。一个方法应该尽可能做好一件事情。如果一个方法处理的事情太多,其颗粒度就会变得很粗,不利于重用。
SingleResponsibility1.java
public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } } /** * 交通工具类 * 在run方法中,违反了单一职责原则 * 解决的方法:根据交通工具运行方法的不同,分解成不同的类 */ class Vehicle { public void run(String vehicle){ System.out.println(vehicle+"在公路上运行"); } }
SingleResponsibility2.java
public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); WaterVehicle waterVehicle = new WaterVehicle(); waterVehicle.run("轮船"); } } /** * 遵守单一职责原则 * 改动很大:即将类分解,同时修改客户端 * 改进:直接修改Vehicle类,将单一职责原则往下传递,即在方法级别上做单一职责原则 */ 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+"水中运行"); } }
SingleResponsibility3.java
public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽车"); vehicle2.runWater("轮船"); vehicle2.runAir("飞机"); } } /** * 在方法上遵守单一职责,但类上没有遵守单一职责原则. */ 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+"在水中上运行"); } }