單一職責原則:
單一職責原則注意事項和細節:
1.降低類的複雜度,一個類隻負責一項職責
2.提高類的可讀性,可維護性
3.降低變更引起的風險
4.通常情況下,我們應當遵守單一職責原則,隻有邏輯足夠簡單,才可以在代碼級違反單一職責原則;隻有類方法數量足夠少,可以在方法級别保持單一職責原則。
案例:
1.在方式1的run 方法中,違反了單一職責原則,案例中飛機不能在公路上跑,而是在天空中飛行
package singleresponsibility;
public class SingleResponsibility {
public static void main(String[] args) {
Vehile vehile = new Vehile();
vehile.run("小汽車");
vehile.run("機車");
vehile.run("飛機");
}
}
//交通工具類
//方式1:
//1.在方式1的run 方法中,違反了單一職責原則
//2.解決方案非常簡單,根據交通工具運作方法不同,分解成不同類即可
class Vehile{
public void run(String vehicle){
System.err.println(vehicle + " 在公路上跑");
}
}
2.改進方案:寫了三個獨立的類,遵守了單一職責原則,但是這樣的改動很大,即将類分解,同時修改了用戶端
package singleresponsibility;
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("潛艇");
}
}
//方案2的分析
//1.遵守單一職責原則
//2.但是這樣的改動很大,即将類分解,同時修改用戶端
//3.改進:直接修改Vehicle類,改動的代碼會比較少 ==》 方案3
class RoadVehicle{
public void run(String vehicle){
System.err.println( vehicle + " 在公路上運作!");
}
}
class AirVehicle{
public void run(String vehicle){
System.err.println(vehicle + " 在天上飛行");
}
}
class WaterVehicle{
public void run(String vehicle){
System.err.println(vehicle + " 在水裡運作");
}
}
3.再次改進方案:這種改進方案對原始的方案沒有大的改動,隻是增加了方法,此種方法一定成都上沒有遵守單一職責原則,但是在方法級别上遵守了單一職責原則。與單一職責原則中第四條:隻有類方法數量足夠少,可以在方法級别保持單一職責原則。
package singleresponsibility;
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("汽車");
vehicle.runAir("飛機");
vehicle.runWater("輪船");
}
}
//方式3的分析:
//1.這種修改方式,沒有對原來的類做大的修改隻是增加了方法
//2.一定程度上沒有完全(類上面)遵守單一職責原則,但是在方法級别上遵守了單一職責原則
class Vehicle{
public void run(String vehicle){
System.err.println(vehicle + " 在公路上運作");
}
public void runAir(String vehicle){
System.err.println(vehicle + " 在天空運作");
}
public void runWater(String vehicle){
System.err.println(vehicle + " 在水中運作");
}
}