对类来说,即一个类应用只负责一项职责,如类A负责两个不同的职责:职责1,职责2.当职责1需求变更时,可造成职责2执行错误,所以需要将类A的粒度分解为A1,A2.
对类来说,即一个类应用只负责一项职责,如类A负责两个不同的职责:职责1,职责2.当职责1需求变更时,可造成职责2执行错误,所以需要将类A的粒度分解为A1,A2.
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应该遵守单一职责原则,只在逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中方法数量足够少时,可以在方法级别保持单一职责原则即可
package www.perwrj.principle.SRP; /** * 方案一:不遵守单一职责原则 * @author wangruijie * */ public class SingleResponsibilityDemo1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("汽车"); vehicle.run("飞机"); vehicle.run("潜艇"); /* * 汽车在跑 飞机在跑 潜艇在跑 */ } } /** * 交通工具类 * @author wangruijie * */ class Vehicle{ /** * run方法中,违反单一职责原则 * 解决方案很简单,根据交通工具运行的方式不同,分解成不同的类即可 * @param vegicle */ public void run(String vegicle) { System.out.println(vegicle + "在跑"); } }
package www.perwrj.principle.SRP; /** * 方案二:遵守了单一职责原则 * 但这样花销很大,要将类分解,同时修改客户端 * 改进:直接修改Vehicle类 * @author wangruijie * */ public class SingleResponsibilityDemo2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("汽车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); WaterVehicle waterVehicle = new WaterVehicle(); waterVehicle.run("潜艇"); } } /** * 地上跑的 * @author wangruijie * */ class RoadVehicle{ public void run(String vehicle) { // TODO Auto-generated method stub System.out.println(vehicle + "地上跑的"); } } /** * 天上飞的 * @author wangruijie * */ class AirVehicle{ public void run(String vehicle) { // TODO Auto-generated method stub System.out.println(vehicle + "天上飞的"); } } /** * 在水中跑 * @author wangruijie * */ class WaterVehicle{ public void run(String vehicle) { // TODO Auto-generated method stub System.out.println(vehicle + "在水中跑"); } }
package www.perwrj.principle.SRP; /** * 方案三 * 这种修改方法没有对原来类做大的修改,只是增加了方法。 * 没有在类级别上遵守单一职责原则 * 在方法级别上遵守单一职责原则 * @author wangruijie * */ public class SingleResponsibilityDemo3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽车"); vehicle2.runAir("飞机"); vehicle2.runWater("潜艇"); } } /** * 交通工具类 * @author wangruijie * */ class Vehicle2{ /** * * @param vegicle */ public void run(String vegicle) { System.out.println(vegicle + "在地上跑"); } public void runAir(String vegicle) { System.out.println(vegicle + "在天上跑"); } public void runWater(String vegicle) { System.out.println(vegicle + "在水里跑"); } }