編寫軟件過程當中,程序員面臨着來自耦合性,內聚性以及可維護性,可擴展性,重用性,靈活性等多方面的挑戰,設計模式是爲了讓程序(軟件)。具備更好
1)代碼重用性(即:相同功能的代碼,不用屢次編寫)
2)可讀性(即:編程規範性,便於其餘程序員的閱讀和理解)
3)可擴展性(即:當須要增長新的功能時,很是的方便,稱爲可維護)
4)可靠性(即:當咱們增長新的功能後,對原來的功能沒有影響)
5)使程序呈現高內聚,低耦合的特性
6)設計模式包含了面向對象的精髓,「懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要「
7)Scott Mayers 在其鉅著《Effective C++》就曾經說過 :C++老手和C++新手的區別就是前者手背上有不少傷疤java
設計模式原則,其實就是程序員在編程時,應當遵照的原則,也是各類設計模式的基礎(即:設計模式爲何這樣設計的依據)
設計模式經常使用的七大原則有 :
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 + " 在公路上運行。。。。。"