圖解Java設計模式之設計模式七大原則
編寫軟件過程中,程序員面臨着來自耦合性,內聚性以及可維護性,可擴展性,重用性,靈活性等多方面的挑戰,設計模式是為了讓程序(軟件)。具有更好
1)代碼重用性(即:相同功能的代碼,不用多次編寫)
2)可讀性(即:編程規范性,便於其他程序員的閱讀和理解)
3)可擴展性(即:當需要增加新的功能時,非常的方便,稱為可維護)
4)可靠性(即:當我們增加新的功能后,對原來的功能沒有影響)
5)使程序呈現高內聚,低耦合的特性
6)設計模式包含了面向對象的精髓,“懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要“
7)Scott Mayers 在其巨著《Effective C++》就曾經說過 :C++老手和C++新手的區別就是前者手背上有很多傷疤
設計模式原則,其實就是程序員在編程時,應當遵守的原則,也是各種設計模式的基礎(即:設計模式為什么這樣設計的依據)
設計模式常用的七大原則有 :
1)單一職責原則
2)接口隔離原則
3)依賴倒轉(倒置)原則
4)里氏替換原則
5)開閉原則
6)迪米特法則
7)合成復用原則
對類來說的,即一個類應該只負責一項職責。如類A負責兩個不同職責 :職責1,職責2。當職責1需求變更而改變A時,可能造成職責2執行錯誤,所以需要將類A的粒度分解為A1,A2
以交通工具案例講解
package com.example.testdemo.mode.principle; public class SingleResponsibility1 { public static void main(String[] args) { 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 + " 在公路上運行。。。。。"); } } package com.example.testdemo.mode.principle; public class SingleResponsibility2 { public static void main(String[] args) { ReadVehicle readVehicle = new ReadVehicle(); readVehicle.run("摩托車"); readVehicle.run("汽車"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飛機"); WaterVehicle waterVehicle = new WaterVehicle(); waterVehicle.run("輪船"); } } /** * 方案2分析 : * 1 :遵守單一職責原則 * 2 :但是這樣改動大,即將類分解,同時修改客戶端 * 3 :改進 :直接修改Vehicle類,改動的代碼會比較少 =》方案3 * */ class ReadVehicle { 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 + "水中運行"); } } package com.example.testdemo.mode.principle; public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽車"); vehicle2.runAir("飛機"); vehicle2.runWater("輪船"); } } /** * 方案3的分析 : * 1 :這種修改方法沒有對原來的類做大的修改,只是增加方法 * 2 :這里雖然沒有在類這個級別上遵守單一職責原則,但是在方法級別上,仍然是遵守單一職責 */ class Vehicle2 { public void run(String vehicle) { System.out.println(vehicle