設計模式是根據原則為實現代碼的復用、程序可擴展和穩定,對代碼進行優化的過程和經驗總結。當然,原則也是經驗總結。原則是設計模式的執行綱領,重要性不言而喻。本篇博客就介紹六大原則。
## 一、單一職責原則
定義:不要存在多于一個使類變更的原因。簡單說就是:各人自掃門前雪,修管他人瓦上霜,各司其職。
緣由:編寫的軟件不能沒有錯誤,因此對代碼的修改是必然的。為了避免某一處的修改導致更多的錯誤,就要求單一原則。單一原則要求每個類,每個模塊各司其職,就減小了修改對其他類的影響。
優點:
1、降低類的復雜度,一個類只負責一項職責,使程序的邏輯簡單。
2、提高類的可讀性,提高系統的可維護性。
3、降低變更的風險。
故事說明:三國演義50回,曹操敗走華容,關云長義釋曹操的故事想必大家都知道。因為單次事件不足以模擬我們的代碼,這里假設這個故事可以重復發生。諸葛亮對各個將領的職責分配是明確的,最后因為關羽念舊情放走了操作,使的諸葛亮的計謀最終沒有達到想要的結果(即軟件出現錯誤)。那么假設這件事重復發生了,我們知道了關羽(類)出了錯,我們只要修改關羽就可以了,因為關羽之前的每一個步驟的結果都是對的。同時各個將領的職責時明確的,沒有聯系的,他們并不會因為關羽的改變而導致操作最后不走華容道。
## 二、開放封閉原則
定義:一個軟件實體,類、模塊或者函數應該對擴展開放,就修改關閉。簡單的說就是可以增加功能,而不允許修改功能。
緣由:軟件開發過程中必然要面臨需求變更,那么對需求功能擴展時。我們要做的就是盡量的只增加功能,而不修改已經寫好的部分。所以,要準備好擴展的接口,同時盡量不去修改寫好的功能。
優點:保證框架,用實現擴展。
故事說明:假設你建立了一家小公司,然后經過多年經營,發展良好,有員工20名。原來沒有配備財務人員的你需要專門的財務人員了,現在面臨兩個選擇:一是,從公司的員工中挑一個送學習(修改),二是到人才市場上招聘一個財務人員(擴展)。你選哪個呢?顯然第二種選擇立竿見影的滿足了你的需求。
## 三、里氏代換原則
定義:子類型必須能夠替換它們的父類型,簡單說就是“父債子還”。
緣由:這講的是繼承的原則,只有當子類可以替換掉父類,軟件單位的功能不受到影響時,父類才算真正被復用,而子類也能夠在父類的基礎上增加新的行為。
優點:代碼繼承復用
故事解析:倚天屠龍記趙敏襲擊武當,張三豐教了張無忌太極拳,可以看做是繼承關系。即張無忌從張三豐那繼承了太極拳。這時玄冥二老要和張三豐打,但是他之前已經受傷了。于是,張無忌這個徒弟代替師父出戰(里氏代換原則),但是這個繼承關系并不影響張無忌還學會了很多其他武功。
## 四、依賴倒轉原則
定義:高層模塊不應該依賴低層模塊,二者都應該依賴于其抽象;抽象不應該依賴細節,細節依賴抽象。簡單的說就是依賴接口編程,不要對實現編程。即只要結果不顧過程。
緣由:假設高層類A依賴于低層B,這時要A類該為依賴于C類則必須對A類進行修改(這里B類和C類是相似功能的類)。這樣將會帶來不必要的風險。因此,如果加入一個抽象,即接口。將A類與低層的類隔開,他們共同依賴于接口。
優點:用一個穩定的接口將高層對低層的依賴關系破壞掉,則接口和高層,接口和低層之間的關系都穩定 了。為可能的修改降低風險。
故事解析:劉備要去攻打孫權,開始下了一道圣旨給張飛讓他去打。后來覺得張飛靠不住于是又下了一道圣旨給關羽改他去打。這個過程當中劉備下了兩道圣旨。后來,劉備招來了軍師諸葛亮,這時他又想打孫權,于是下了一道圣旨給諸葛亮說我要打孫權。于是,諸葛亮就去調兵遣將去把孫權打了。有了軍師之后,劉備只要關心和軍師之間的關系就可以了,并不用在意誰去打。而張飛,關羽等也不用直接執行劉備的命令。這樣就優化了他們的管理關系。這里諸葛亮的角色就相當于一個接口,有了他之后,劉備只需要做戰略決策,個將領只需要負責打仗。
## 五、迪米特法則
定義:一個對象應該對其他對象保持最少的了解。簡單說就是對象之間不依賴與關系來保證運行的。
緣由:類與類之間的關系越密切,耦合度越大。當一個類發生改變時,對另一個類的影響也越大。
優點:減少不必要的類間依賴,減低耦合關系。
故事解析:無