单一职责原则(SRP:Single responsibility principle)
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
简单定义:
一个对象应该只包含单一的职责,并且该职责完全封装在一个类中
另一种定义
就一个类而言,就是引起它变化的因素只有一个
单一职责原则分析
- 一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性越小,就是一个类的职责承担太多,这些职责耦合在一起,一个职责发生改变,其他的就会发生改变
- 类的职责主要包括两个方面:数据职责和方法职责,数据职责通过其属性,行为职责通过其方法来体现
- 单一职责原则是实现高内聚,低耦合
代码理解
public class Vehicle {
public void run(String VehicleName) {
System.out.println(VehicleName+"在公路上运行");
}
}
public class SimpleResponsibility {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("小汽车");
vehicle.run("飞机");
vehicle.run("自行车");
vehicle.run("轮船");
}
}
在这里代码就会出现逻辑性的问题,飞机是在天空中飞行的,轮船是在水中行驶的,交通工具有很多种,在不同的地方行驶,就违反了单一职责原则
就不符合单一职责原则
按类拆分
class RoadVehicle{
public void run(String VehicleName) {
System.out.println(VehicleName+"在公路上运行");
}
}
class WaterVehicle{
public void run(String VehicleName) {
System.out.println(VehicleName+"在水上上运行");
}
}
class AirVehicle{
public void run(String VehicleName) {
System.out.println(VehicleName+"在天空上运行");
}
}
public class SimpleResponsibility {
public static void main(String[] args) {
RoadVehicle carVehicle = new RoadVehicle();
carVehicle.run("小汽车");
carVehicle.run("自行车");
System.out.println("===========");
WaterVehicle vehicle2 = new WaterVehicle();
vehicle2.run("轮船");
System.out.println("===========");
AirVehicle airplane = new AirVehicle();
airplane.run("飞机");
}
}
但是这样改动就比较大
按方法拆分
public class Vehicle2 {
//按方法拆分
//虽然在类级别没有遵守单一职责原则,但是在方法上是遵守单一职责原则
public void roadRun(String vechileName) {
System.out.println(vechileName+"在公路上运行");
}
public void waterRun(String vechileName) {
System.out.println(vechileName+"在水路上运行");
}
public void airRun(String vechileName) {
System.out.println(vechileName+"在空中上运行");
}
}
public class SimpleResponsibility {
public static void main(String[] args) {
Vehicle2 Vehicle2 = new Vehicle2();
Vehicle2.airRun("飞机");
System.out.println("============");
Vehicle2.waterRun("轮船");
System.out.println("===========");
Vehicle2.roadRun("小汽车");
}
}