出版時(shí)間:2008 出版社:人民郵電出版社 作者:Ross Harmes,Dustin Diaz 頁(yè)數(shù):249 譯者:謝廷晟
Tag標(biāo)簽:無
前言
設(shè)計(jì)模式對(duì)于程序員來說并不是一個(gè)陌生話題。在Erich Gamma等人合著的經(jīng)典著作《設(shè)計(jì)模式》出版之后,十幾年間陸續(xù)出現(xiàn)了許多這方面的專著。不過它們大都結(jié)合Java和C++等傳統(tǒng)的面向?qū)ο笳Z(yǔ)言進(jìn)行講解,而講述設(shè)計(jì)模式在動(dòng)態(tài)語(yǔ)言中的實(shí)現(xiàn)的書則較為罕見。在早期的JavaScript編程實(shí)踐中,這種語(yǔ)言只被用于做點(diǎn)為網(wǎng)頁(yè)涂脂抹粉的小差事;程序的規(guī)模很小,也很簡(jiǎn)單。那個(gè)時(shí)候恐怕沒有人會(huì)想到把設(shè)計(jì)模式用到這種“玩具語(yǔ)言”編寫的程序中。隨著Ajax技術(shù)的興起,Web)應(yīng)用的許多邏輯都從服務(wù)器端轉(zhuǎn)移到客戶端執(zhí)行,客戶端JavaScript程序的作用越來越重要,其規(guī)模和復(fù)雜程度也越來越大,人們也越來越多地把面向?qū)ο蠓椒☉?yīng)用到JavaScript程序設(shè)計(jì)中。在此背景下,有許多人開始研究設(shè)計(jì)模式在JavaScript程序設(shè)計(jì)中的應(yīng)用,網(wǎng)上也陸續(xù)出現(xiàn)了一些關(guān)于這個(gè)話題的零星討論。但是到目前為止,系統(tǒng)地探討面向?qū)ο蟮某绦蛟O(shè)計(jì)模式在JavaScript語(yǔ)言中的實(shí)現(xiàn)的書,只此一本。(Michael Mahemof所著的《Ajax設(shè)計(jì)模式》一書總結(jié)的是運(yùn)用Aiax技術(shù)開發(fā)Web應(yīng)用的各種設(shè)計(jì)模式,雖然也涉及大量JavaScript編程,但它與本書關(guān)注的焦點(diǎn)不同。本書討論的是一些通用的面向?qū)ο笤O(shè)計(jì)模式在JavaScript中的實(shí)現(xiàn),屬于更基礎(chǔ)性的東西,它們不僅僅適用于Web客戶端編程。) JavaScript這種語(yǔ)言與Java等傳統(tǒng)的面向?qū)ο笳Z(yǔ)言有很大的不同。它的動(dòng)態(tài)性、詞法作用域和基于原型的繼承機(jī)制等特點(diǎn)可能會(huì)讓很多初次接觸它的程序員都有點(diǎn)不習(xí)慣,而且由于語(yǔ)言設(shè)計(jì)上的一些不完善,許多在傳統(tǒng)面向?qū)ο笳Z(yǔ)言中只是舉手之勞的事在JavaScript卻不得不依靠hack手法來實(shí)現(xiàn)。這也許就是那些已經(jīng)熟知設(shè)計(jì)模式在Java等語(yǔ)言中實(shí)現(xiàn)方式的程序員也需要本書的原因。本書第一部分著重講述了面向?qū)ο蠹夹g(shù)在JavaScript中的實(shí)現(xiàn)方法。這對(duì)于對(duì)JavaScript只有過初步了解的人非常有用(當(dāng)然,本書不適合對(duì)JavaScript一竅不通的讀者。他們應(yīng)該先找一本,JavaScript基礎(chǔ)教材來看看,比如人民郵電出版社出版的《JavaScript基礎(chǔ)教程》)。Java和C++編程老手們?cè)趯W(xué)完這部分內(nèi)容之后,想必應(yīng)該能夠在JavaScript程序設(shè)計(jì)中自行應(yīng)用各種經(jīng)典的設(shè)計(jì)模式了。不過不同的人可能會(huì)有一些不同的做法,因此繼續(xù)看看本書第二部分,借鑒一下作者的方法也不無益處。對(duì)于那些從未學(xué)過設(shè)計(jì)模式的JavaScript程序員來說,本書的重要性更是毋庸置疑。不過,坦率地說,要想深入學(xué)習(xí)設(shè)計(jì)模式僅看本書是不夠的。取代Gamma等人的《設(shè)計(jì)模式》并不是本書的目標(biāo)。
內(nèi)容概要
《JavaScript設(shè)計(jì)模式》共有兩部分。第一部分給出了實(shí)現(xiàn)具體設(shè)計(jì)模式所需要的面向?qū)ο筇匦缘幕A(chǔ)知識(shí),主要包括接口、封裝和信息隱藏、繼承、單體模式等內(nèi)容。第二部分則專注于各種具體的設(shè)計(jì)模式及其在JavaScript 語(yǔ)言中的應(yīng)用,主要介紹了工廠模式、橋接模式、組合模式、門面模式等幾種常見的模式。為了讓每一章中的示例都盡可能地貼近實(shí)際應(yīng)用,書中同時(shí)列舉了一些JavaScript 程序員最常見的任務(wù),然后運(yùn)用設(shè)計(jì)模式使其解決方案變得更模塊化、更高效并且更易維護(hù),其中較為理論化的例子則用于闡明某些要點(diǎn)?!禞avaScript設(shè)計(jì)模式》適合各層次的Web 前端開發(fā)人員閱讀和參考,也適合有C++/Java/C# 背景的服務(wù)器端程序員學(xué)習(xí)。
作者簡(jiǎn)介
Ross Harmes,資深Web程序員,有10多年編程經(jīng)驗(yàn)?,F(xiàn)任Yahoo前端工程師。他是開源圖片博客軟件Birch的開發(fā)者。Blog地址為Http://tecrhfoolery.com?! ustin Diaz,資深Web程序員,現(xiàn)任Google用戶界面工程師。新一代JavaScript框架DEDlChain(兼具jQuery和YUI的優(yōu)勢(shì))的開發(fā)者。他還是一位中長(zhǎng)跑健將,800米跑曾經(jīng)在全美國(guó)排名第13。擁有西班牙語(yǔ)學(xué)士學(xué)位。個(gè)人網(wǎng)站http://dustindiaz.com。
書籍目錄
第一部分 面向?qū)ο蟮腏avaScript第1章 富有表現(xiàn)力的JavaScript1.1 JavaScript的靈活性1.2 弱類型語(yǔ)言1.3 函數(shù)是一等對(duì)象1.4 對(duì)象的易變性1.5 繼承1.6 JavaScript中的設(shè)計(jì)模式1.7 小結(jié)第2章 接口2.1 什么是接口2.1.1 接口之利2.1.2 接口之弊2.2 其他面向?qū)ο笳Z(yǔ)言處理接口的方式2.3 在JavaScript中模仿接口2.3.1 用注釋描述接口2.3.2 用屬性檢查模仿接口2.3.3 用鴨式辨型模仿接口2.4 本書采用的接口實(shí)現(xiàn)方法2.5 Interface類2.5.1 Interface類的使用場(chǎng)合2.5.2 Interface類的用法2.5.3 示例:使用Interface類2.6 依賴于接口的設(shè)計(jì)模式2.7 小結(jié)第3章 封裝和信息隱藏3.1 信息隱藏原則3.1.1 封裝與信息隱藏3.1.2 接口扮演的角色3.2 創(chuàng)建對(duì)象的基本模式3.2.1 門戶大開型對(duì)象3.2.2 用命名規(guī)范區(qū)別私用成員3.2.3 作用域、嵌套函數(shù)和閉包3.2.4 用閉包實(shí)現(xiàn)私用成員3.3 更多高級(jí)對(duì)象創(chuàng)建模式3.3.1 靜態(tài)方法和屬性3.3.2 常量3.3.3 單體和對(duì)象工廠3.4 封裝之利3.5 封裝之弊3.6 小結(jié)第4章 繼承4.1 為什么需要繼承4.2 類式繼承4.2.1 原型鏈4.2.2 extend函數(shù)4.3 原型式繼承4.3.1 對(duì)繼承而來的成員的讀和寫的不對(duì)等性4.3.2 clone函數(shù)4.4 類式繼承和原型式繼承的對(duì)比4.5 繼承與封裝4.6 摻元類4.7 示例:就地編輯4.7.1 類式繼承解決方案4.7.2 原型式繼承解決方案4.7.3 摻元類解決方案4.8 繼承的適用場(chǎng)合4.9 小結(jié)第5章 單體模式5.1 單體的基本結(jié)構(gòu)5.2 劃分命名空間5.3 用作特定網(wǎng)頁(yè)專用代碼的包裝器的單體5.4 擁有私用成員的單體5.4.1 使用下劃線表示法5.4.2 使用閉包5.4.3 兩種技術(shù)的比較5.5 惰性實(shí)例化5.6 分支5.7 示例:用分支技術(shù)創(chuàng)建XHR對(duì)象5.8 單體模式的適用場(chǎng)合5.9 單體模式之利5.10 單體模式之弊5.11 小結(jié)第6章 方法的鏈?zhǔn)秸{(diào)用6.1 調(diào)用鏈的結(jié)構(gòu)6.2 設(shè)計(jì)一個(gè)支持方法鏈?zhǔn)秸{(diào)用的JavaScript庫(kù)6.3 使用回調(diào)從支持鏈?zhǔn)秸{(diào)用的方法獲取數(shù)據(jù)6.4 小結(jié)第二部分 設(shè)計(jì)模式第7章 工廠模式7.1 簡(jiǎn)單工廠7.2 工廠模式7.3 工廠模式的適用場(chǎng)合7.3.1 動(dòng)態(tài)實(shí)現(xiàn)7.3.2 節(jié)省設(shè)置開銷7.3.3 用許多小型對(duì)象組成一個(gè)大對(duì)象7.4 示例:XHR工廠7.4.1 專用型連接對(duì)象7.4.2 在運(yùn)行時(shí)選擇連接對(duì)象7.5 示例:RSS閱讀器7.6 工廠模式之利7.7 工廠模式之弊7.8 小結(jié)第8章 橋接模式8.1 示例:事件監(jiān)聽器8.2 橋接模式的其他例子8.3 用橋接模式聯(lián)結(jié)多個(gè)類8.4 示例:構(gòu)建XHR連接隊(duì)列8.4.1 添加核心工具8.4.2 添加觀察者系統(tǒng)8.4.3 開發(fā)隊(duì)列的基本框架8.4.4 實(shí)現(xiàn)隊(duì)列8.4.5 哪些地方用了橋接模式8.5 橋接模式的適用場(chǎng)合8.6 橋接模式之利8.7 橋接模式之弊8.8 小結(jié)第9章 組合模式9.1 組合對(duì)象的結(jié)構(gòu)9.2 使用組合模式9.3 示例:表單驗(yàn)證9.3.1 匯合起來9.3.2 向FormItem添加操作9.3.3 向?qū)哟误w系中添加類9.3.4 添加更多操作9.4 示例:圖片庫(kù)9.5 組合模式之利9.6 組合模式之弊9.7 小結(jié)第10章 門面模式10.1 一些你可能已經(jīng)知道的門面元素10.2 JavaScript庫(kù)的門面性質(zhì)10.3 用作便利方法的門面元素10.4 示例:設(shè)置HTML元素的樣式10.5 示例:設(shè)計(jì)一個(gè)事件工具10.6 實(shí)現(xiàn)門面模式的一般步驟10.7 門面模式的適用場(chǎng)合10.8 門面模式之利10.9 門面模式之弊10.10 小結(jié)第11章 適配器模式11.1 適配器的特點(diǎn)11.2 適配原有實(shí)現(xiàn)11.3 示例:適配兩個(gè)庫(kù)11.4 示例:適配電子郵件API11.4.1 用適配器包裝Web郵件API11.4.2 從fooMail轉(zhuǎn)向dedMail11.5 適配器模式的適用場(chǎng)合11.6 適配器模式之利11.7 適配器模式之弊11.8 小結(jié)第12章 裝飾者模式12.1 裝飾者的結(jié)構(gòu)12.1.1 接口在裝飾者模式中的角色12.1.2 裝飾者模式與組合模式的比較12.2 裝飾者修改其組件的方式12.2.1 在方法之后添加行為12.2.2 在方法之前添加行為12.2.3 替換方法12.2.4 添加新方法12.3 工廠的角色12.4 函數(shù)裝飾者12.5 裝飾者模式的適用場(chǎng)合12.6 示例:方法性能分析器12.7 裝飾者模式之利12.8 裝飾者模式之弊12.9 小結(jié)第13章 享元模式13.1 享元的結(jié)構(gòu)13.2 示例:汽車登記13.2.1 內(nèi)在狀態(tài)和外在狀態(tài)13.2.2 用工廠進(jìn)行實(shí)例化13.2.3 封裝在管理器中的外在狀態(tài)13.3 管理外在狀態(tài)13.4 示例:Web日歷13.4.1 把日期對(duì)象轉(zhuǎn)化為享元13.4.2 外在數(shù)據(jù)保存在哪里13.5 示例:工具提示對(duì)象13.5.1 未經(jīng)優(yōu)化的Tooltip類13.5.2 作為享元的Tooltip13.6 保存實(shí)例供以后重用13.7 享元模式的適用場(chǎng)合13.8 實(shí)現(xiàn)享元模式的一般步驟13.9 享元模式之利13.10 享元模式之弊13.11 小結(jié)第14章 代理模式14.1 代理的結(jié)構(gòu)14.1.1 代理如何控制對(duì)本體的訪問14.1.2 虛擬代理、遠(yuǎn)程代理和保護(hù)代理14.1.3 代理模式與裝飾者模式的比較14.2 代理模式的適用場(chǎng)合14.3 示例:網(wǎng)頁(yè)統(tǒng)計(jì)14.4 包裝Web服務(wù)的通用模式14.5 示例:目錄查找14.6 創(chuàng)建虛擬代理的通用模式14.7 代理模式之利14.8 代理模式之弊14.9 小結(jié)第15章 觀察者模式15.1 示例:報(bào)紙的投送15.1.1 推與拉的比較15.1.2 模式的實(shí)踐15.2 構(gòu)建觀察者API15.2.1 投送方法15.2.2 訂閱方法15.2.3 退訂方法15.3 現(xiàn)實(shí)生活中的觀察者15.4 示例:動(dòng)畫15.5 事件監(jiān)聽器也是觀察者15.6 觀察者模式的適用場(chǎng)合15.7 觀察者模式之利15.8 觀察者模式之弊15.9 小結(jié)第16章 命令模式16.1 命令的結(jié)構(gòu)16.1.1 用閉包創(chuàng)建命令對(duì)象16.1.2 客戶、調(diào)用者和接收者16.1.3 在命令模式中使用接口16.2 命令對(duì)象的類型16.3 示例:菜單項(xiàng)16.3.1 菜單組合對(duì)象16.3.2 命令類16.3.3 匯合起來16.3.4 添加更多菜單項(xiàng)16.4 示例:取消操作和命令日志16.4.1 使用命令日志實(shí)現(xiàn)不可逆操作的取消16.4.2 用于崩潰恢復(fù)的命令日志16.5 命令模式的適用場(chǎng)合16.6 命令模式之利16.7 命令模式之弊16.8 小結(jié)第17章 職責(zé)鏈模式17.1 職責(zé)鏈的結(jié)構(gòu)17.2 傳遞請(qǐng)求17.3 在現(xiàn)有層次體系中實(shí)現(xiàn)職責(zé)鏈17.4 事件委托17.5 職責(zé)鏈模式的適用場(chǎng)合17.6 圖片庫(kù)的進(jìn)一步討論17.6.1 用職責(zé)鏈提高組合對(duì)象的效率17.6.2 為圖片添加標(biāo)簽17.7 職責(zé)鏈模式之利17.8 職責(zé)鏈模式之弊17.9 小結(jié)索引
章節(jié)摘錄
在事件驅(qū)動(dòng)的環(huán)境中,比如瀏覽器這種持續(xù)尋求用戶關(guān)注的環(huán)境中,觀察者模式〔又名發(fā)布者—訂閱者(publisher-subscriber)模式〕是一種管理人與其任務(wù)之間的關(guān)系(確切地講,是對(duì)象及其行為和狀態(tài)之間的關(guān)系)的得力工具。用JavaScript的話來說,這種模式的實(shí)質(zhì)就是你可以對(duì)程序中某個(gè)對(duì)象的狀態(tài)進(jìn)行觀察,并且在其發(fā)生改變時(shí)能夠得到通知。 觀察者模式中存在兩個(gè)角色:觀察者和被觀察者。本書一般傾向于稱其為發(fā)布者和訂閱者。這種模式在JavaScript中有幾種不同的實(shí)現(xiàn)方式,本章將對(duì)其中的一些實(shí)現(xiàn)方式進(jìn)行考察。不過我們首先要說明一下發(fā)布者和訂閱者這兩種角色。下一節(jié)的例子以報(bào)業(yè)為例說明了觀察者模式的工作方式?! ?5.1 示例:報(bào)紙的投送 在報(bào)紙行業(yè)中,發(fā)行和訂閱的順利進(jìn)行有賴于一些關(guān)鍵性的角色和行為。首先是讀者。他們都是訂閱者(subscriber),是與你我一樣的人。我們消費(fèi)數(shù)據(jù)并且根據(jù)讀到的消息做出反應(yīng)。我們可以選擇自己的居住地點(diǎn),讓報(bào)社把報(bào)紙送到自己家中。這個(gè)活動(dòng)中的另一個(gè)角色是發(fā)行方(publisher)。他們負(fù)責(zé)出版諸如San Francisco Chronicle、New York Times和Sacramento Bee這樣的報(bào)紙。 確定了各方的身份之后,我們就可以分析每一方的職責(zé)所在。作為報(bào)紙的訂閱者,我們有一些事要做。數(shù)據(jù)到來的時(shí)候我們收到通知。我們消費(fèi)數(shù)據(jù)。然后我們根據(jù)數(shù)據(jù)做出反應(yīng)。只要報(bào)紙到了訂閱者手中,他們就可以自行處置。有些人讀完之后會(huì)將其扔在一邊,有些人會(huì)向朋友或家人轉(zhuǎn)述其中的新聞,甚至還有一些人會(huì)把報(bào)紙送回去。總而言之,訂閱者要從發(fā)行方接收數(shù)據(jù)。 發(fā)行方則要發(fā)送數(shù)據(jù)。在本例中,發(fā)行方也是投送方(deliver)。一般說來,一個(gè)發(fā)行方很可能有許多訂閱者,同樣,一個(gè)訂閱者也很可能會(huì)訂閱多家報(bào)社的報(bào)紙。問題的關(guān)鍵在于,這是一種多對(duì)多的關(guān)系,需要一種高級(jí)的抽象策略,以便訂閱者能夠彼此獨(dú)立地發(fā)生改變,而發(fā)行方能夠接受任何有消費(fèi)意向的訂閱者?! ?5.1.1 推與拉的比較 對(duì)于報(bào)社來說,只為給幾個(gè)訂閱者投送報(bào)紙就滿世界跑是不劃算的。而紐約市的居民也不可能特意飛到舊金山去拿自己訂的San Francisco Chronicle,要知道這份報(bào)紙可以直接投送到他們家門口。 訂閱者要想拿到報(bào)紙的話有兩種投送方式可選:推或拉。在推環(huán)境中,發(fā)行方很可能會(huì)雇傭投送人員四處送報(bào)。換句話說,他們把自己的報(bào)紙推出去,讓訂閱者收取。在拉環(huán)境中,規(guī)模較小的本地報(bào)社可能會(huì)在訂閱者家附近的街角提供自己的數(shù)據(jù),供訂閱者“拉”。那些成長(zhǎng)型發(fā)行方?jīng)]有足夠的資源進(jìn)行大規(guī)模投送,因此采用拉方案,讓訂閱者到當(dāng)?shù)氐碾s貨店或自動(dòng)售貨機(jī)那里“拿”報(bào),對(duì)于它們來說往往是個(gè)優(yōu)化投送環(huán)節(jié)的好辦法?! ?5.1.2 模式的實(shí)踐 在JavaScript中有多種方法可以實(shí)現(xiàn)發(fā)布者—訂閱者模式。在展示那些示例之前,我們先確保各種角色的扮演者(對(duì)象)及其行為(方法)都已就緒。
媒體關(guān)注與評(píng)論
“本書道前人所未道,引導(dǎo)你從編寫代碼進(jìn)化為設(shè)計(jì)代碼。書中絕大部分示例代碼都來自YUI等實(shí)戰(zhàn)項(xiàng)目,并進(jìn)行了深入剖析。強(qiáng)烈推薦。” ——Nicholas C.Zakas,著名.JavaScript專家,Yarl00前端工程師,暢銷書《JavaScript高級(jí)程序設(shè)計(jì)》作者 “毫不夸張地說,這是我有生以來讀到的最好的一本JavaScript圖書。作者講授了大量獨(dú)門的專家經(jīng)驗(yàn)。” ——Mostafa Farghaly,埃及程序員
編輯推薦
從這里開始,真正掌握J(rèn)avaScript的精髓?! oogle和Yahoo專家聯(lián)手揭秘世界頂尖公司的技術(shù)內(nèi)幕 Amazon全五星譽(yù)圖書 Web應(yīng)用取代桌面程序的時(shí)代已經(jīng)到來!作為Web前端的核心技術(shù),JavaScript的重要性不言而喻,它有望成為下一代統(tǒng)治性程序語(yǔ)言。但由于業(yè)界長(zhǎng)期的誤解和濫用,也有不少人仍然對(duì)此半信半疑。那么,JavaScript到底能否當(dāng)此大任呢? 本書中,Google和Yahoo公司的兩位資深Web專家對(duì)此給出了擲地有聲的肯定回答。作者針對(duì)常見的開發(fā)任務(wù),從YUI等實(shí)戰(zhàn)代碼中取材,提供了專家級(jí)的解決方案,不僅透徹剖析了JavaScript中的面向?qū)ο缶幊?。而且深入探討了如何用JavaScript實(shí)現(xiàn)以前只在服務(wù)器端應(yīng)用的設(shè)計(jì)模式。如何根據(jù)實(shí)際場(chǎng)景選擇恰當(dāng)?shù)脑O(shè)計(jì)模式,開發(fā)出高質(zhì)量的企業(yè)級(jí)代碼。本書充分證明:JavaScript不僅毫不遜色于其他高級(jí)語(yǔ)言,已經(jīng)是一種成熟且強(qiáng)大的面向?qū)ο笳Z(yǔ)言。而且還擁有Java和C++等語(yǔ)言不具備的面向未來的特性,因此更加靈活、更富于表現(xiàn)力。 無論是前端工程師-還是服務(wù)器端程序員,通過本書都將使自己的JavaScript功力提升到前所未有的高度。
圖書封面
圖書標(biāo)簽Tags
無
評(píng)論、評(píng)分、閱讀與下載
JavaScript設(shè)計(jì)模式 PDF格式下載