天天看點

設計模式的七大設計原則:其一:單一職責原則

單一職責原則:

單一職責原則注意事項和細節:

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 +  " 在水中運作");
    }
}
           

繼續閱讀