IT餐館 第三回 模式

2021-05-07 11:38:41 字數 4008 閱讀 4580

就在上回聚會後不久,杜鵬就在 msn上聯絡雨辰,說他們公司最近新招來了兩個新人,

其中乙個小伙對設計模式很感興趣,沒事就找老杜聊怎麼學這個東西,老杜想起雨辰前些

年總愛在酒桌上與大家聊這些話題,所以就想單獨約雨辰出來給那個小伙講講。

雨辰因為最近產品要發布測試版有些忙,所以就約在三天後的週六中午在王利的餐館

碰頭。就這樣,雨辰週六中午早早就到餐館隨便點了兩個菜先吃了起來,就在這時,老杜

帶著那個年輕人走了近來,看樣子小伙像剛大學畢業沒兩年的樣子,帶著眼睛,很靦腆。

一走到雨辰面前就馬上伸出手,嘴裡說著:「雨哥,您好,今天打擾了」。

雨辰趕忙招呼小伙和老杜坐下,又點了三瓶啤酒,讓過菜譜給小伙,讓他點些自己可

口的菜。小伙不好意思的說:「隨便隨便」,老杜搶過菜譜對小伙說:「別客氣,咱們是aa

制,所以隨便點愛吃的就行,呵呵。」

就在老杜翻著菜譜的時候,雨辰笑著對那個小伙說:「小兄弟,聽老杜說了你的一些

情況,我只是有個疑問就是你怎麼想研究設計模式這方面的東西呀?」

「主要是感覺裡面挺高深,一大堆天書似的概念,所以好奇才一直瞎瞧,只是不得其

法,不知道該怎麼學,怎麼用。」 小伙有些迷茫的說著。

雨辰笑著說:「我知道了,其實我當初跟你也差不多,對於技術人員而言必定好奇心

和興趣是最大的動力。不過在學習設計模式之前最好先要把基本打好,物件導向語言裡的

繼承封裝,多型,過載等你之前都接觸過吧。」

小伙說:「上大學的時候學過,這些年工作上也用上了。」

雨辰點了點頭說:「那就好,這可以說省了不少的事。說白了,設計模式就是建立在

物件導向設計思想基本上的,按物件導向程式設計中的原則,在特定應用場景下的實現『特例』,

所以說每個模式都是乙個特例,乙個特定場景下的特例。」

小伙若有所思的說:「好像聽明白了一些,但還是有點不清楚 。」

雨辰笑著繼續說:「srp,ocp,dip,lkp,這些名詞你都聽過吧?」

小伙點了一下頭說:「在大學裡上課是聽老師說過,後來看書也多少了解了一些。」

雨辰接著說:「那就好辦了,其實這些設計原則就是設計模式所遵循的準則,比如說

ocp原則,也就是『開關原則』,其核心就是『設計應該能夠容納新的功能需求的增加,但

是增加的方式不是通過修改又有的模組(類),而是通過增加新的模組(類)來完成的。

而設計模式中大多數都是遵循這一原則的,比如說strategy和抽象工廠模式。」

雨辰邊說邊給老杜和小伙各倒了一杯啤灑,然後接著又說:「而lkp,也就是最少知識

原則也有相應的模式實現—『facade』模式。」

小伙想了一想,點點頭說:「策略模式之前用過,現在想起來還真是這麼回事,那您的

意思就是說這些原則是基礎,要想學好模式,就要先理解並用好這些原則。」

「是的,的確如此,這是攀登模式這棟高樓的梯子,沒有它,你要走很多的彎路,甚至

會半途而廢。」雨辰肯定了小伙的話。

「那您說等把這些原則都掌握了之後,要先從那幾個模式學起呀?」 小伙繼續問著。

雨辰想了一想說:「singleton,façade,decorate和strategy模式,這四個模式用

的很廣,並且在類的關係結構上也比較清晰,學習上沒什麼太多的困擾。」

這時老杜也點了兩個菜,放下手中的菜譜說:「你們二位還真談上了,看來我省事了,

呵呵。」

然後老杜轉過頭,對身邊的小伙說:「其實你平時在咱們專案中用的那幾個模式有些過於

拘泥於書中所說的,動不動就把書中的類全部一對一的敲到**中。」

老杜喝了一口啤酒繼續說:「如果這樣死學的話,如果哪天別人把你看的書裡的類圖變了

一下,你就犯暈了,其實模式其自身的類圖和實現示例只是一種參考,如果死按這些內容

去開發的話,不暈死才怪。」

雨辰點了點頭,其實早在joshua kerievsky的書refactoring to patterns 中就已提

這這個問題,甚至還把一些模式存心變個樣子(換另一種實現方法)整個馬甲出來,目的

就是要讓大家不要過於拘泥於圖和**,而應該從『神似』而不是『形似』來理解和使用模式。

小伙聽得有些似懂非懂,問雨辰:「我和我身邊的朋友都是從示例**一步步學過來的,

如果不看**和類圖的話,肯定是理解不了書中所說的那些抽象概念的!」

「看歸看,但不必對那些**過於計較,主要理解設計模式意圖就可以了。其實在學習

設計模式時,按我的理解可以分為三個階段。」 雨辰笑著說。

小伙來了精神,追問:「哪三個階段呀?」

雨辰喝了口啤酒,慢慢的說著:「第一階段就是你目前所處的這個階段,即對書照貓畫

虎。當了解幾個模式之後,就開始在專案或自己設想的應用場景中有空就去嘗試一下,基

本上是一邊看書一邊敲**。」

小伙點點頭:「沒錯,你說的太對了,目前我就是這種情況,經常剛看完的模式就想馬

上找個專案來練手,呵呵。」

雨辰笑著說:「你可以在自己的demo或想像中的場景中嘗試這些模式,但決不應該掌

客戶的專案來練手,因為到頭來如果使用不當,你和客戶都會被模式這把『雙刃劍』所傷。」

小伙嘆了口氣:「聽雨哥這麼一說,我才開了竅,慚愧。那第二個階段呢?」

雨辰接著說:「呵呵,只要你捨得死我就捨得埋(郭德綱的經典語錄,雨辰把這句話變

成口頭禪了)。第二階段要比第一階段累心,因為這是乙個要不斷把已學習過的模式翻來覆

去品味的階段。目前假如你只學了四五個模式還好說,必定它們之間的差別還比較明顯。但

當你看了更多的模式並把他們綜合思考的話,你會發現這些模式當中有不少模式從**或類

圖上看有些像是『乙個媽生的』,比如strategy, bridge, state這三者,還有builder和抽象

工廠等等。所以到這個階段就要充分比較模式之間的差別,關聯,分析具體的應用場景了。

當然模式就其性質分為建立型,結構型和行為型,當你在不同型別的模式間學習比較時,從

其所屬型別上你也會分析出一些線索。」

小伙彷彿已看到了自己在第二階段時為了模式而抓狂的情景,但還是不免好奇的問:「

那過了這一關,第三階段是什麼呢?」

雨辰彷彿從小伙的眼中看到了自己當年的影子,很高興的說:「那就是『無模式』了,忘掉

所有的模式和**,回歸物件導向設計本身,在自己的程式中遵循我們剛說過的物件導向的

那些原則,不要刻意在你的**中為了使用模式而使用模式,而是通過重構和完善已有**

的方式,潤物細無聲的使用模式。到那時當別人再看你的**時,看到的是可擴充套件性強,可

復用性高,可讀性強,可維護的**了。到了那一天,你可以說已把物件導向的精髓參透了。」

小伙這下被徹底整蒙了,真沒想到結果會是這個樣子。

看著小伙一臉迷惘的表情。雨辰意味深長的說:「如果不能完全聽懂沒關係,必定剛才

用了十多分鐘所說的內容,是我用了三年才參透的,總有一天你會知道的,到那時你就可

以和我一起唱『only you』了,呵呵。其實很多人在第二階段就當了逃兵,我相信你不是那

種輕言放棄的人,努力吧,呵呵。」

「分析原始碼,特別是國外的開源專案中的原始碼,當然你也可以找一些有關源**分析的

書籍來看,必定看別人怎麼用設計模式的,要比自己一天倒晚瞎琢磨快許多。」雨辰接著又

使用reflector這類工具來進行分析,必定看的場景多了,自然而然就會摸到門道兒了。」

小伙好奇的問:「難道.net框架中也有模式。」

雨辰笑著說:「當然有了,模式這麼好的東西微軟為啥不用,比如說httpmodule這個設

計就是基於observer模式實現的。而那些textwriter,streamwriter,stringwriter就

是參考decorate實現的,除此以外還有很多地方,只見你用心分析就會有所收穫。」

老杜這時說:「差不多了吧,聊了這些,菜都涼了,趕緊吃吧。」

雨辰這時才想起來,發現聊技術時忘記桌子上的菜已被老杜乾掉了不少,連忙招呼小伙

邊吃邊聊,就這樣,一直扯到了日頭快落山時才各自回家。

tags: it餐館,模式

設計模式 學習筆記 第三回

adapter 介面卡 模式 使用場景 已經給定了消費者和生產者,即呼叫者和被呼叫者,但是二者的藉口不統 一 不匹配,可以通過本模式,增加乙個翻譯層,將呼叫請求傳送給被呼叫者。從而,在不修改消費者和生產者的前提下,完成二者的匹配問題。有點像翻譯人員的作用和所處的位置,例如,乙個說英語的e要和乙個說中...

第三回 實數域

上回已經構造了實數系 mathbb r sim.下面在 mathbb 上定義一些運算使之構成乙個域.mathbb 中的元素由有理數基本列的等價類 a n 構成,為了記號的方便,我們今後就用 a n 來表示.仿照有理數域,我們希望定義加減乘除.其中加法和減法比較好定義 a n b n a n b n ...

第三回 Controller與View

這節我們讓asp.net mvc真正的跑起來 首先我們自己新建乙個新的controller在controllers上點右鍵,新增,controller選項 之後出現乙個對話方塊 這裡我們將之起名為eicecontroller 附註一下,這裡是個純廣告,無興趣可略過此行 www.eice.com.cn...