設計模式系列·初探設計模式之王小二的疑問

子路發表於2017-03-28

前言

以小說的筆法寫的設計模式系列文章,你絕對看得懂![首發於公眾號:"聊聊程式碼"]

設計模式系列·王小二需求歷險記(一)
設計模式系列·王小二需求歷險記(二)
設計模式系列·封裝、繼承、多型
設計模式系列·初探設計模式之王小二的疑問
設計模式系列·Facade模式之MVC的煩惱
設計模式系列·Adapter 模式之如何優雅的使用別人的輪子
設計模式系列·類爆炸之Bridge模式
設計模式系列·工廠方法模式之 Code Review
設計模式系列·抽象工廠模式

------華麗的分割線------

你見過凌晨四點的北京嗎?

開發了一個月的專案,終於要上線了!王小二和同事們正在為今晚的上線做最後的準備。

萬事俱備,只欠東風。因為專案是與D公司合作開發的,D公司上線過程中出了問題,所以王小二他們也沒有辦法,只能等著了。

1個小時...2個小時...5個小時過去了,大家都睡過去了。“叮鈴鈴...叮鈴鈴...”,一陣刺耳的鈴聲響起,原來是C哥的鬧鈴。

小二看看錶,凌晨4點了。此時睡意全無,去找C哥聊聊天吧!

“C哥,你鬧鈴怎麼凌晨4點就響了?”
“哈哈,你見過凌晨四點的北京嗎?”

小二頓時充滿敬意,原來大牛都這麼努力,自己還有什麼理由不奮鬥呢?說學就學,再向C哥學幾招。

“C哥啊,真是佩服你。上次你給我講的物件導向,受益匪淺!”
"對,物件導向有很多優勢,但你更應該深入的瞭解設計模式,這才是王道。"

“設計模式,一直聽人說,但是不怎麼了解,C哥你能給我講講嗎?”
“好,閒著也是閒著,我就給你大體講講吧!”

[圖:凌晨四點的北京]

設計模式系列·初探設計模式之王小二的疑問

現在學設計模式早嗎?

“C哥,我有一個疑問。有人說我應該先把物件導向學好了之後再學設計模式。是不是現在接觸設計模式有點早啊?”

“以我的經驗來看,事實剛好相反。物件導向與設計模式一起學,可以大大提高你對物件導向的理解,因為設計模式與物件導向是相輔相成的。就如你吃飯時,米飯與菜一樣,不能只吃米飯不吃菜吧?得一塊吃。”

設計模式產生於建築學

“小二啊,你知道嗎?設計模式,最初來源於建築學。”
“什麼?建築學?原來萬事萬物都有聯絡啊!”小二眼睛瞪得圓圓的。

“是啊。那我給你講講設計模式與建築學的淵源吧。”

Long long ago,一名建築師自問:“建築的質量可以衡量嗎?可以客觀評價嗎?”也就是說,建築的設計美觀與否、優秀與否,有沒有客觀的根據呢?有沒有一個模式去衡量呢?

為了研究這個問題,這名建築師觀察了很多建築物,他驚奇的發現:任何建築物,優秀的結構之間總有一些相同之處。

隨著研究的深入,這名建築師認為設計不可以與要解決的問題分離。而他必須要觀察出來解決相同問題的不同設計。

通過這樣的方式---觀察解決相同問題的不同設計,縮小了他的關注焦點,他可以洞悉優質設計之間的相似之處。他把這些相似之處稱為模式。

最後,他給模式下了一個定義:“在某一情景下的問題解決方案”。

從建築學到軟體設計模式

C哥繼續說道:“每種模式,你都可以無數次使用。用來解決我們重複遇到的這些問題。”
“哦哦,設計模式還挺有用的,如果掌握了設計模式,那我就可以解決很多通用的問題了。”

“是的。慢慢的,有人發現,能不能將建築學的模式應用到軟體開發呢?”
“我覺得肯定可以啊。軟體開發中有很多不斷重複出現的,但可以用相同方式去解決的問題。”王小二答道。

“嗯嗯,不錯嘛小二。確實,大家認識到了這點後,很多人從事設計模式研究的工作。其中有四個人,他們寫了一本書,書中共收錄了23種設計模式,這對設計模式在軟體開發中的應用產生了深遠影響,大家都稱他們為四人團”。

為什麼要學設計模式?

“小二,說了這麼多,你絕的我們為什麼要學習設計模式呢?”

小二答道:我覺得吧,主要有2點:

  1. 更好的理解物件導向;
  2. 複用優秀的解決方案。因為通過複用別人優秀的設計,自己可以避免走很多彎路,針對問題能快速的提出優秀的解決方案。

“嗯,你說的沒錯。但還有更重要的一點,你沒說到。”
“什麼啊?還有其他用處?”

“學習設計模式,可以給你一個更高層次的視角去分析、解決問題,避免過早的陷入處理細節的困局。“
”有點不太明白...“

"因為面對問題,很多人會過早的去考慮實現程式的細節,但這往往會模糊了真正的問題。而設計模式,就能幫你去走出這樣的思維困局,面對問題,你會站在一個更高的層次去考慮如何設計。更能清晰的去面對問題,也就能有更好的解決方案。雖然還是有點抽象,以後慢慢體會就知道了。"

”哦哦,確實是這樣啊,我慢慢體會吧。“

四人團的建議

”小二,你知不知道,四人團針對建立優秀物件導向的設計提出了一些策略?“
”真的嗎?什麼策略“。

他們說的3點很重要:

  1. 針對介面程式設計;
  2. 優先使用物件組合,而不是繼承;
  3. 找到並封裝變化的點。

回家睡覺嘍

不知不覺中,過去了2個小時,已經凌晨6點了,D公司也解決了問題。
可以上線了,不出意料,上線過程很順利。
終於可以回家睡覺了!

更多精彩,請關注公眾號“聊聊程式碼”,讓我們一起聊聊“左手程式碼右手詩”的事兒。

設計模式系列·初探設計模式之王小二的疑問

相關文章