1. 程式人生 > 其它 >設計模式-七大設計原則-單一職責原則

設計模式-七大設計原則-單一職責原則

一、單一職責原則介紹

二、單一職責原則引入

1.方式一(違反了單一職責原則)

解析:摩托車、汽車是公路上執行的,但飛機並不是在公路上執行的。

public class SingleResponsibility1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Vehicle vehicle = new Vehicle();
        vehicle.run("摩托車");
        vehicle.run("汽車");
        vehicle.run(
"飛機"); } } // 交通工具類 // 方式1 // 1. 在方式1 的run方法中,違反了單一職責原則 // 2. 解決的方案非常的簡單,根據交通工具執行方法不同,分解成不同類即可 class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上執行...."); } }

2.方式二(類級別遵守了單一職責原則,但是改動會很大)

解析:如果需要再實現一個不同交通方式,比如"宇宙飛船天空執行",那麼就需要新增一個"宇宙飛船類"及"run方法",最後客戶端要new一個宇宙飛船物件才能呼叫新的"run方法"。

public class SingleResponsibility2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("摩托車");
        roadVehicle.run("汽車");
        
        AirVehicle airVehicle = new AirVehicle();
        
        airVehicle.run(
"飛機"); } } //方案2的分析 //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 + "水中執行"); } }

3.方式三(類級別沒有遵守單一職責原則,但是方法級別上遵守了,推薦)

解析:這裡如果需要新增"宇宙飛船天空執行"這個交通方式,只需要在類中新增對應的方法即可,客戶端直接呼叫"新的run方法"。

public class SingleResponsibility3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Vehicle2 vehicle2  = new Vehicle2();
        vehicle2.run("汽車");
        vehicle2.runWater("輪船");
        vehicle2.runAir("飛機");
    }

}


//方式3的分析
//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 + " 在水中行....");
    }
    
    //方法2.
    //..
    //..
    
    //...
}

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