定义:
应该有且仅有一个原因引起类的变更(There should never be more than one reason for a class to change)
单一职责原则为我们提供了一个编写程序的准则,要求我们在编写类,抽象类,接口时,要使其功能职责单一纯碎,将导致其变更的因素缩减到最少。
如果一个类承担的职责过多,就等于把这些职责耦合在一起。一个职责的变化可能会影响或损坏其他职责的功能。而且职责越多,这个类变化的几率就会越大,类的稳定性就会越低。
在软件开发中,经常会遇到一个功能类T负责两个不同的职责:职责P1,职责P2。现因需求变更需要更改职责P1来满足新的业务需求,当我们实现完成后,发现因更改职责P1竟导致原本能够正常运行的职责P2发生故障。而修复职责P2又不得不更改职责P1的逻辑,这便是因为功能类T的职责不够单一,职责P1与职责P2耦合在一起导致的。
1.错误示范
package com.kris.designmode.principle.singleresponsibility;public class SingleResponsibility {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("摩托车");vehicle.run("汽车");vehicle.run("飞机");}}/*** 交通工具* 方式1* 1.在方式一的run方法中,违反了单一职责原则* 2.解决方案非常简单,根据交通工具运行方式不同,分解成不同的类*/class Vehicle{public void run(String vehicle){System.out.println(vehicle+" 在公路上跑。。。。");}}
2.改进1-类级别单一职责
package com.kris.designmode.principle.singleresponsibility;public class SingleResponsibility02 {public static void main(String[] args) {RoadVehicle roadVehicle = new RoadVehicle();roadVehicle.run("汽车");AirVehicle airVehicle = new AirVehicle();airVehicle.run("飞机");WaterVehicle waterVehicle = new WaterVehicle();waterVehicle.run("轮船");}}/*** 方案2分析* 1.遵守单一职责原则* 2.但是这样改动大,既将类分解,又要改动客户端* 3.改进:直接修改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+"在水中运行");}}
3.改进2-方法级别单一职责
package com.kris.designmode.principle.singleresponsibility;public class SingleResponsibility03 {public static void main(String[] args) {Vehicle2 vehicle2 = new Vehicle2();vehicle2.run("汽车");vehicle2.runWater("轮船");vehicle2.runAir("飞机");}}/*** 方式3分析* 1.这种修改方法没有对原来的类做大的修改,只是增加方法* 2.虽然没有在类级别遵守单一职责原则,但是在方法级别仍然是遵守单一职责原则* 3.如果类里面不止run还有其他很多功能,那需要拆分成类级别的单一职责原则*/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+"在水中运行");}}
4.总结

