《鄧哥奇遇記9》—— 設計模式之六大基本原則

  我們在學習、開發或面試時經常會聽到設計模式,很多同學也多多少少能說出一點關於設計模式的東西來,但是很多同學卻一直無法理解設計模式的精髓,那麼今天開始我們就來聊聊設計模式~
  我們依舊提出幾個問題:
  01設計模式和設計原則是什麼關係?
  答:所有的設計模式都是遵循設計原則的,不能違反設計原則。
  02設計原則的核心思想是什麼?
  核心思想只有兩條:減少複雜度(讓一個複雜的邏輯變成多個簡單的邏輯),降低耦合度(讓模塊之間的關聯減少,使得模塊之間更獨立、更清晰)
  那麼今天我們就來用鄧哥的故事來和大家聊聊設計模式的六大基本原則。
  1.單一職責原則
  週末恰逢鄧哥休息在家,感受安靜的清晨,正準備睡個回籠覺之際,鄧嫂將鄧哥踢下牀對鄧哥說:“把屋子掃了,衣服洗了,午飯做了,衣櫥整理一下~”
  鄧哥只能耷拉着雙眼乖乖的去幹活。但是鄧哥要做的事情太多,所以手忙腳亂的。結果洗衣服沒有甩幹,灑了一地的水,手沾了水弄溼了衣櫥裏的衣服,做午飯忘了時間弄糊了。然後只能乖乖的去跪搓衣板。。。
  在這個故事裏,鄧哥就好比是程序中的一個模塊。我們儘量不要在一個模塊裏寫過多的業務邏輯,否則業務邏輯之間可能會相互干擾,引起更多的錯誤。
  在這個故事中,如果只讓鄧哥做一件事,估計還是可以做的好的,但是同時讓鄧哥做這麼多的事,就會出現問題。所以單一職責原則的本質就是要將一個複雜的邏輯拆分成多個簡單的邏輯,以此來降低複雜度。
  2.里氏代換原則
  鄧哥喜歡妹子,可以推出鄧哥喜歡鄧嫂(因爲鄧嫂是妹子)。但是鄧哥喜歡鄧嫂,無法推出鄧哥喜歡所有的妹子(主要原因可能是不敢)。
  里氏代換原則的一個核心思想就是父類能做的事、能去的地方,子類必須也能做、也能去。
  從邏輯上舉個例子,大前提:我喜歡動物。小前提:大熊貓是動物。結論:我喜歡大熊貓。
  在這個例子中,大熊貓是動物的一種,所以很明顯動物是大熊貓的父類,所以對父類成立的邏輯對子類也必然成立。但是反過來,我喜歡大熊貓無法推論出我喜歡動物。所以如果一個方法或模塊使用了一個子類,那麼這個子類不能用其父類代替。
  里氏代換原則的核心:父親能做的孩子都能做,孩子能做的父親不能做,降低耦合度。
  3.開閉原則
  閉原則:鄧哥在外邊經常受欺負,鄧嫂很生氣,覺得這樣很不合理。於是規定:鄧哥只能被鄧嫂打,如果有人想要打鄧哥,必須和鄧嫂說,然後由鄧嫂來打鄧哥~
  開原則:鄧嫂經常覺得鄧哥太笨了,琴棋書畫不會,洗衣做飯嫌累。所以鄧嫂決定讓孩子來學習琴棋書畫。
  開閉原則的核心就是對修改關閉,對擴展開放。
  就像是在這個例子中,如果誰都能打鄧哥就亂套了,所以規定只能由鄧嫂來打鄧哥,這樣方便管理。這就是對修改關閉。
  當我們覺得鄧哥的功能太少的時候(琴棋書畫不會),我們也不能直接給鄧哥增加功能,只能通過擴展的方式(讓鄧哥的孩子來學)。這樣最後總體上鄧家就有了會親戚書畫的人了。
  由於里氏代換原則的存在,在需要鄧哥的時候,鄧哥的孩子可以替代,所以就解決了鄧哥不會琴棋書畫的問題~開閉原則的核心:對修改關閉,對擴展開發,依次來減少耦合度。
  4.依賴倒置原則
  鄧哥每天在家都聽鄧嫂指揮,終於有一天鄧哥硬氣了一回~鄧哥對鄧嫂說:“你每天都命令我做這個做那個,傳出去我多沒面子~我不要面子的嘛~?”鄧嫂想了想覺得鄧哥說的確實有道理。於是對鄧哥說:“以後每天我就不命令你了~你每天看小紙條吧~小紙條上寫什麼你就做什麼,都是小紙條命令你的,和我就木有關係了~”
  鄧哥一想有道理,於是就答應了。從此以後,每天鄧嫂都不會對鄧哥呼來喚去了~有什麼事就往小紙條上寫~
  鄧哥和鄧嫂就相當於程序中的兩個函數或者兩個模塊。原本這兩個模塊是相互依賴的關係(A調用B)。但是這樣會有一個問題,就是當一個模塊發生修改的時候,總會對相關模塊產生影響,爲了降低這種影響,人們決定使用依賴倒置原則來降低核心模塊間的耦合度。
  依賴倒置原則的核心:讓原來相互依賴的兩個核心模塊,變爲同時依賴於另一個非核心模塊。以此來降低核心模塊的耦合度。
  5.接口分離原則
  有一天鄧哥對鄧嫂說:“我想下樓買菜,回家打遊戲,晚上吃排骨&……#%&&#*巴拉巴拉一大堆”,鄧嫂對鄧哥說,一口氣說這麼多誰聽得懂~一件一件說~
  很多的同學在工作初期,喜歡定義一個接口之後,通過傳不同的參數做不同的事,最後只有一個接口,但是參數極其複雜。
  就像是這個例子中這樣,鄧哥雖然只說了一句話,但是內容極其複雜,這樣明顯增加了系統的複雜度。
  所以我們需要使用接口分離原則,其實接口分離原則和單一職責原則非常的像,就是每個接口負責的內容儘量單一,不要使用複雜的總接口,以此來降低系統的複雜度。
  6.迪米特法則
  鄧嫂爲了不讓鄧哥學壞,平時經常告誡鄧哥:“不要和陌生人說話~”
  “不要和陌生人說話”就是迪米特法則的精髓所在,迪米特法則指的就是:除了自身,當前對象的成員,參數,當前對象所創建的對象之外,儘量不要與其他外部實體或模塊產生關聯(引用或調用),以此來降低系統的耦合度。
  最後,六大基本原則纔是程序設計的基本原則,我們學習的設計模式只不過是遵循基本原則的比較經典的具體實踐。比如工廠模式,符合開閉原則、策略模式符合依賴倒置原則,觀察者模式符合依賴倒置原則等等。所以我們在學習的時候,一定要學習知識的本質,不要只學習表象,否則就會出現學了還不會用的情況~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章