一、单一职责原则
基本介绍
对类来说,一个类应该只负责一项原则,如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
注意事项和细节
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们都应该遵守单一职责原则。只有逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中的方法足够少,可在方法级别保持单一职责原则
应用实例
/**
* Created with IntelliJ IDEA.
* User: Mingda
* Time: 2024/2/21 021 22:35
* File: Singleresponsibility1
* Description: 单一职责原则,方式1
*/
public class SingleResponsibility1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("轮船");
vehicle.run("高铁");
vehicle.run("汽车");
}
}
/**
* 方式1:
* 1. 在方式1的run方法中,违反了单一职责原则
* 2. 解决方法:应根据交通工具运行方式的不同,分解成不同的类
*/
// 交通工具类
class Vehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在公路上行驶!!!");
}
}
/**
* Created with IntelliJ IDEA.
* User: Mingda
* Time: 2024/2/23 14:27
* File: SingleResponsibility2
* Description: 单一职责原则,方式2
*/
public class SingleResponsibility2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("汽车");
FlightVehicle flightVehicle = new FlightVehicle();
flightVehicle.run("飞机");
SeaVehicle seaVehicle = new SeaVehicle();
seaVehicle.run("轮船");
}
}
/**
* 方式2:
* 1. 遵守单一职责原则
* 2. 但是这样改动很大,将类分解,需要修改客户端
* 3. 改进:直接修改Vehicle类,改动很小(相较于方式2)
*/
// 公路交通工具类
class RoadVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在公路上行驶");
}
}
// 飞行交通工具类
class FlightVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在空中飞行");
}
}
// 海上交通工具类
class SeaVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在海上行驶");
}
}
/**
* Created with IntelliJ IDEA.
* User: Mingda
* Time: 2024/2/23 14:41
* File: SingleResponsibility3
* Description: 单一职责原则,方式3
*/
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle2 vehicle = new Vehicle2();
vehicle.runRoad("汽车");
vehicle.runFlight("飞机");
vehicle.runSea("轮船");
}
}
/**
* 方式3:
* 1. 将所有方法都放到一个类中,每个方法都实现一个职责
* 2. 类级别没有遵守单一职责原则,但是方法级别遵守单一职责原则
*/
// 交通工具类
class Vehicle2 {
public void runRoad(String vehicle) {
System.out.println(vehicle + "在公路上行驶");
}
public void runSea(String vehicle) {
System.out.println(vehicle + "在海上行驶");
}
public void runFlight(String vehicle) {
System.out.println(vehicle + "在空中行驶");
}
}