一個模式就是一個可重用的方案,可應(yīng)用于在軟件設(shè)計(jì)中的常見問題 - 在我們的例子里 - 就是編寫JavaScript的web應(yīng)用程序。模式的另一種解釋就是一個我們?nèi)绾谓鉀Q問題的模板 - 那些可以在許多不同的情況里使用的模板。 那么理解和熟悉模式為什么是如此的重要?設(shè)計(jì)模式有以下三點(diǎn)好處:
模式不是一個確切的解決方案。我們要記住模式的角色僅僅是給我們提供一個解決方案。模式不能解決所有的設(shè)計(jì)問題,也不能代替優(yōu)秀的軟件設(shè)計(jì)師。然而,它們在幫助我們。接下來我們將看看模式必須提供的其他的一些優(yōu)勢。
為了了解模式有多有用,讓我們看看jQuery提供給我們的一個很簡單的元素選擇問題。 假設(shè)我們有一個為頁面上每一個class為"foo"的DOM元素添加一個計(jì)數(shù)器的腳本,什么才是查詢這個元素的集合的最有效的方法呢?有幾種不同的方法可以解決這個問題:
選擇頁面上所有的元素并存儲它們的引用,然后使用正則表達(dá)式 (或其他方式) 來過濾這個集合中那些class為"foo"的元素的引用。
那些,這些選擇哪個是最快的呢?實(shí)際上第三個,比其他的替代選擇快 8-10倍。但在實(shí)際的應(yīng)用程序中,第三個選擇無法在Internet Explorer 9以下的版本中使用,從而只能使用第一個,第二個和第三個都不支持。
使用jQuery的開發(fā)人員就不必?fù)?dān)心這個問題,因?yàn)楹苄疫\(yùn)的是它使用Facade模式把這個問題抽象了出來。正如我們即將在后面更詳細(xì)的介紹的那樣,這種模式提供了一組簡單的對更復(fù)雜的底層代碼的抽象接口 (例如$el.css(),$el.animate()) 。正如我們所看到的,這意味著我們只會對實(shí)現(xiàn)級別的細(xì)節(jié)花費(fèi)更少的時間。
在其后,庫會根據(jù)我們當(dāng)前瀏覽器的支持自動選擇最優(yōu)的方法來選擇元素,我們只使用抽象層。
我們可能都熟悉jQuery的$("selector"),這是更容易使用的在一個頁面選擇HTML元素的方法,這樣我們就不必手動來選擇getElementById(),getElementsByClassName(),getElementByTagName()等方法。
雖然我們知道querySelectorAll()試圖解決這個問題,但比比使用jQuery的Facade接口和自己來選擇最優(yōu)的方式時花費(fèi)的精力,毫無疑問,使用模式可以提供真實(shí)世界的抽象價值。
我們將在本書的后面看到更多的設(shè)計(jì)模式。
記住并不是每個算法、每個最佳實(shí)踐和每個解決方案都可能被認(rèn)為是一個完整的模式。這兒可能缺少了幾個關(guān)鍵因素,而且模式社團(tuán)除非經(jīng)過嚴(yán)格的審查才謹(jǐn)慎地聲明某東西為模式的。即使某東西對我們來說似乎滿足了模式標(biāo)準(zhǔn),它都不應(yīng)該被當(dāng)作模式,直到它由他人經(jīng)過適當(dāng)時間的周密調(diào)查和測試后才可能當(dāng)作模式。
回頭看看Alexander曾經(jīng)做過的工作,他聲明模式應(yīng)當(dāng)既是過程也是“事物”。這個定義故意不明確,因?yàn)樗o跟著說模式應(yīng)該是創(chuàng)建“事物”的過程。這就是為什么模式通常集中定位在表面上可識別的結(jié)構(gòu)的原因。例如,我們應(yīng)當(dāng)能夠可視化地描繪(或者繪制)圖片來展示把模式應(yīng)用到實(shí)踐中的結(jié)構(gòu)。
在研究設(shè)計(jì)模式的時候,無意間碰到術(shù)語“模式原型”是很正常的。那么什么是模式原型呢? 好,仍然沒有通過"模式特性”測試的模式通常認(rèn)為是模式原型。模式原型也許源自于某人已經(jīng)確定的值得與社團(tuán)共享的特定解決方案的工作,然而由于它提出時間短,所以可能仍然沒有機(jī)會接受嚴(yán)格的審查。
另外,個人共享的模式也許沒有時間或者沒有興趣通過“模式特性”測試這個過程,不過可能發(fā)布了這些模式原型的簡短說明。這種類型模式的簡要描述或者片段就是眾所周知的小模式。
全面文檔化具有資格的模式這樣的工作是非常令人氣餒的?;仡^看看設(shè)計(jì)模式領(lǐng)域最早期的某些工作,如果一個模式能做到以下事情,那么這個模式就可以認(rèn)為是“好的”模式:
我們認(rèn)為不滿足準(zhǔn)則的模式原型不值得學(xué)習(xí),這可以得到諒解,然而,事實(shí)遠(yuǎn)不是這樣的。許多模式原型確實(shí)非常的好。我不是說所有的模式原型都值得看,不過總有幾個在自然環(huán)境下成長的有用的模式原型可以在未來的項(xiàng)目中幫到我們。從心底里使用上面列表來做最佳評判的話,你在選擇哪個是模式的過程中將感覺非常愉快。
模式是否有效的附加要求之一是模式要展示某些重現(xiàn)現(xiàn)象。這個就是至少在三個關(guān)鍵方面 ,也就是三條規(guī)則驗(yàn)證是否取得資格經(jīng)常要做的事情。為了展示使用這個規(guī)則后的重現(xiàn),模式必須證明其: