前言
以小說的筆法寫的設計模式系列文章,你絕對看得懂![首發於公眾號:"聊聊程式碼"]
設計模式系列·王小二需求歷險記(一)
設計模式系列·王小二需求歷險記(二)
設計模式系列·封裝、繼承、多型
設計模式系列·初探設計模式之王小二的疑問
設計模式系列·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點:
- 更好的理解物件導向;
- 複用優秀的解決方案。因為通過複用別人優秀的設計,自己可以避免走很多彎路,針對問題能快速的提出優秀的解決方案。
“嗯,你說的沒錯。但還有更重要的一點,你沒說到。”
“什麼啊?還有其他用處?”
“學習設計模式,可以給你一個更高層次的視角去分析、解決問題,避免過早的陷入處理細節的困局。“
”有點不太明白...“
"因為面對問題,很多人會過早的去考慮實現程式的細節,但這往往會模糊了真正的問題。而設計模式,就能幫你去走出這樣的思維困局,面對問題,你會站在一個更高的層次去考慮如何設計。更能清晰的去面對問題,也就能有更好的解決方案。雖然還是有點抽象,以後慢慢體會就知道了。"
”哦哦,確實是這樣啊,我慢慢體會吧。“
四人團的建議
”小二,你知不知道,四人團針對建立優秀物件導向的設計提出了一些策略?“
”真的嗎?什麼策略“。
他們說的3點很重要:
- 針對介面程式設計;
- 優先使用物件組合,而不是繼承;
- 找到並封裝變化的點。
回家睡覺嘍
不知不覺中,過去了2個小時,已經凌晨6點了,D公司也解決了問題。
可以上線了,不出意料,上線過程很順利。
終於可以回家睡覺了!
更多精彩,請關注公眾號“聊聊程式碼”,讓我們一起聊聊“左手程式碼右手詩”的事兒。