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