1. 程式人生 > 實用技巧 >Java設計模式(一)七大設計原則

Java設計模式(一)七大設計原則

設計模式包含了面向物件的精髓,“懂了設計模式,你就懂了面向物件分析和設計(OOA/D)的精要”

參考視訊:https://www.bilibili.com/video/BV1G4411c7N4

應用場景->設計模式->剖析原理->分析實現步驟(圖解)->程式碼實現-> 框架或專案原始碼分析(找到使用的地方) 的步驟講解 [比如: 建造者模式 ]

編寫軟體過程中,程式設計師面臨著來自耦合性,內聚性以及可維護性,可擴充套件性,重用性,靈活性等多方面的挑戰,設計模式是為了讓程式(軟體),具有更好的:

  • 1) 程式碼重用性 (即:相同功能的程式碼,不用多次編寫)
  • 2) 可讀性 (即:程式設計規範性, 便於其他程式設計師的閱讀和理解)
  • 3) 可擴充套件性 (即:當需要增加新的功能時,非常的方便,稱為可維護)
  • 4) 可靠性(即:當我們增加新的功能後,對原來的功能沒有影響)
  • 5) 使程式呈現高內聚,低耦合的特性

設計模式原則,其實就是程式設計師在程式設計時,應當遵守的原則,也是各種設計模式的基礎(即:設計模式為什麼這樣設計的依據)。設計模式常用的七大原則有:

  • 1) 單一職責原則
  • 2) 介面隔離原則
  • 3) 依賴倒轉(倒置)原則
  • 4) 里氏替換原則
  • 5) 開閉原則
  • 6) 迪米特法則
  • 7) 合成複用原則

一、單一職責原則

基本介紹

對類來說的,即一個類應該只負責一項

職責。如類A負責兩個不同職責:職責1,職責2。當職責1需求變更而改變A時,可能造成職責2執行錯誤,所以需要將類A的粒度分解為A1,A2。

案例

交通工具類

1.違背單一職責

public class SingleResponsibility1 {

    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽車");
        vehicle.run("摩托車");
        vehicle.run("飛機");
    }

}


class Vehicle { public void run(String vechicle){ System.out.println(vechicle + " 正在路上跑"); } }

一個類混雜了所有交通工具

2.類上遵守單一職責

不同型別交通工具不同的類

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("飛機");
    }

}

// 不同的交通工具不同的類

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.方法級別上遵守單一職責

直接改進Vehicle類

public class SingleResponsibility3 {

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

}



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 + " 在水中執行....");
    }

}

雖然在類上沒有遵守單一職責原則,但是在方法上遵守了,雖然未完全嚴格遵守單一原則,仍可看成遵守了單一職責原則。

沒有對類做大的修改,只是增加了方法。

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

1) 降低類的複雜度,一個類只負責一項職責。
2) 提高類的可讀性,可維護性
3) 降低變更引起的風險
4) 通常情況下,我們應當遵守單一職責原則,只有邏輯足夠簡單,才可以在程式碼級違反單一職責原則;只有類中方法數量足夠少,可以在方法級別保持單一職責原則

二、介面隔離原則

IDEA使用UML外掛

搜尋PlantUML Integration

百度搜索並下載安裝軟體Graphviz-2.38

點選小