单一职责原则
一、为什么这样设计
对于类来说,一个类应该是只负责一项职责。如UserDao这个类管理User的职责,但是它又同时管理Order
的职责,当User这张表需求变更而改变UserDao,可能会导致Order职责执行错误,这也就违反了单一职责
原则。所以我们需要一个OrderDao来管理Order职责需求。
二、单一职责原则注意事项和细节
1. 降低类的复杂度,一个类只负责一项职责。
2. 提高类的可读性,可维护性。
3. 降低变更引起的风险。
4. 通常情况下,我们应当遵守单一职责原则,只要逻辑足够简单,才可以在代码级别违反单一职责原则
也就是说类中的方法数量足够少,可以在方法级别保持单一职责原则。下述代码将会说明
三、代码展示
需求:不同交通工具应用不同场景
- 第一种实现
package Single;
public class Test {
public static void main(String[] args) {
Vechicle vechicle=new Vechicle();
vechicle.run("汽车");
vechicle.run("摩托");
vechicle.run("飞机");
}
//违反单一职责原则,飞机在公路上跑明显不对
static class Vechicle{
public void run(String vehicle){
System.out.println(vehicle+"在公路上运行....");
}
}
}
效果图:
可以看见这种违反单一职责原则,飞机在公路上跑明显不对
- 第二种实现
package Single;
public class TestTwo {
public static void main(String[] args) {
RoadVechicle roadVechicle = new RoadVechicle();
roadVechicle.run("汽车");
AirVechicle airVechicle = new AirVechicle();
airVechicle.run("飞机");
WaterVechicle waterVechicle = new WaterVechicle();
waterVechicle.run("轮船");
}
/**
* 遵守单一职责原则
* 修改太大,类分解
*/
static class RoadVechicle {
public void run(String vehicle) {
System.out.println(vehicle + "在公路上运行....");
}
}
static class AirVechicle {
public void run(String vehicle) {
System.out.println(vehicle + "在天空运行....");
}
}
static class WaterVechicle {
public void run(String vehicle) {
System.out.println(vehicle + "在水里运行....");
}
}
}
效果图:
可以看见这是遵守单一职责原则, 但是修改太大,类分解
- 第三种实现
package Single;
public class TestThree {
public static void main(String[] args) {
Vechicle1 vechicle1 = new Vechicle1();
vechicle1.runRoad("汽车");
vechicle1.runWater("轮船");
vechicle1.runAir("飞机");
}
/**
* 一定程度没有遵守单一职责原则,但是在方法层面依然遵守单一职责原则。改动点小,只是增加方法
*/
static class Vechicle1 {
public void runRoad(String vehicle) {
System.out.println(vehicle + "在公路上运行....");
}
public void runWater(String vehicle) {
System.out.println(vehicle + "在水上运行....");
}
public void runAir(String vehicle) {
System.out.println(vehicle + "在天上运行....");
}
}
}
效果图:
可以看见在方法层面依然遵守单一职责原则。改动点小,只是增加方法!
这样简单的类其实就可以在代码级别违反单一职责原则:
也就是说类中的方法数量足够少,可以在方法级别保持单一职责原则。
人是活的,原则是死的。