一、单一职责原则
基本介绍
对类来说,一个类应该只负责一项原则,如类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 + "在空中行驶");}
}
github笔记