什麼是單一職責?
單一職責的規定是某一個類只做一項專門的職責。
對於類來說, 一個類應該只負責一項專有的職責,如果A類負責兩個不同的職責: 職責1,職責2.當職責1需求變更而改變A
時,可能造成職責2執行錯誤,所以需要將類A的力度分解爲A1,A2
爲什麼要設計爲單一職責?
(1) 降低類的複雜度, 一個類只需要負責一個專項職責
(2) 提高類的可讀性和可維護性
(3) 降低業務變更引起的風險
案例演示01 - 非單一原則
public class Normal {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("汽車");
vehicle.run("飛機");
}
}
/***
* 車輛類,其中定義一個run()方法,代表運行
*/
class Vehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在路上運行");
}
}
很顯然,輸出的結果會是:
汽車在路上運行
飛機在路上運行
單一職責的規定是某一個類只做一項專門的職責。當前Vehicle這個類違反了單一職責的規定,汽車的運行和飛機的運行很顯然不能共用
案例演示02 - 單一原則
public class SinglePrinciple01 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
AirVehicle airVehicle = new AirVehicle();
WaterVehicle waterVehicle = new WaterVehicle();
roadVehicle.run("公交車");
airVehicle.run("飛機");
waterVehicle.run("輪船");
}
}
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 + "在水上運行");
}
}
輸出的結果會是:
汽車在路上運行
飛機在天上運行
輪船在水上運行
遵守了單一職責,但是針對了類做拆分,改動較大,如果每個類中只有少量(假設只有一個)方法, 設計就會顯得有點龐大
案例演示03 - 單一原則
public class SinglePrinciple02 {
public static void main(String[] args) {
Vehicle02 vehicle02 = new Vehicle02();
vehicle02.roadRun("火車");
vehicle02.airRun("飛機");
vehicle02.waterRun("水上");
}
}
class Vehicle02 {
public void roadRun(String vehicle) {
System.out.println(vehicle + "在路上運行");
}
public void airRun(String vehicle) {
System.out.println(vehicle + "在天上運行");
}
public void waterRun(String vehicle) {
System.out.println(vehicle + "在水上運行");
}
}
輸出的結果會是:
汽車在路上運行
飛機在天上運行
輪船在水上運行
這種方式沒有在類級別上遵守單一職責,但是在方法級別上遵守了單一職責。只有在邏輯足夠簡單的情況下,才推薦使用這種方法