简单来说就是一个类只描述一件事, 比如我们熟知的 userDao.java 只负责 用户域功能。如果userDao既操作user表又操作order表,这显然不合理。正确的做法是让orderDao.java去操作order表。
对类来说的,一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
反例
public class SingleResponsibility1 {
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+"在公路上运行......");
}
}
正例
public class SingleResponsibility2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("汽车");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
WaterVehicle waterVehicle = new WaterVehicle();
waterVehicle.run("轮船");
}
}
//交通工具类
//1.遵守单一职责原则
//2.但是这样改动很大,即将类分解,同时修改了客户端
//3.改进: 直接修改Vehicle类,改动的代码会比较少 => 方案3
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+"在水里上运行......");
}
}
优化
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle2 vehicle = new Vehicle2();
vehicle.run("汽车");
vehicle.runWater("轮船");
vehicle.runAir("飞机");
}
}
//交通工具类
//1.这种修改方式没有对原来的类做大的修改,只是增加了方法
//2.虽然没有在类这一级别上遵守单一职责原则,但是在方法级别上,仍然是遵守了单一职责
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+"在水中上运行......");
}
}
关注我,共同进步,每周至少一更。——Wayne
更多【单一职责原则-01.单一职责原则】相关视频教程:www.yxfzedu.com