著名建筑大師Alexander對(duì)模式的定義是:模式,簡(jiǎn)單而言,是出現(xiàn)在世界上的一個(gè)事物以及對(duì)應(yīng)的規(guī)則,這種規(guī)則告訴我們?nèi)绾稳ソ⒃撌挛铮裁磿r(shí)候應(yīng)該建立該事物。它是一個(gè)過(guò)程,也是一件事物,是對(duì)一個(gè)事物的描述以及對(duì)一個(gè)產(chǎn)生該事物的過(guò)程的描述。就是說(shuō),模式是一種規(guī)則之余,它還是一種現(xiàn)象、現(xiàn)狀和事物。
第二章 an Introduction to Patterns
一開始通過(guò)一個(gè)例子引入Observer Pattern,在這本書中,對(duì)模式的描述是用以下格式來(lái)進(jìn)行的:


?Intent?意圖
??????在對(duì)象間定義一個(gè)一對(duì)多的依賴(dependency)關(guān)系,把這些物體分為兩種角色,一種是被觀察者(一),一種是觀察者(多),當(dāng)被觀察者狀態(tài)發(fā)生改變的時(shí)候,所有依賴于它的觀察者都將得到通知
Varies?變化
??????變化的地方在于,觀察者的數(shù)目是隨時(shí)可以更新的,并且要保證觀察者們總能得到更新(stay?up-to-date)
Structure?結(jié)構(gòu)
Comments?評(píng)論
??????觀察者模式也被稱為“發(fā)布者-訂閱者”模式,它的一個(gè)主要用途是在document-view結(jié)構(gòu)中(注:在MVC中,主要的兩個(gè)模式分別是觀察者模式和Mediator模式),文章認(rèn)為,觀察者模式的復(fù)雜性在于,在實(shí)現(xiàn)上選擇Push模型還是Pull模型是一個(gè)比較難以抉擇的問(wèn)題。(注:Push和Pull并不是針對(duì)通知而言,兩種模型中都是被觀察者通知觀察者,而非Pull中觀察者去輪詢被觀察者,兩者的區(qū)別是,Push模型是指由被觀察者向觀察者發(fā)送狀態(tài)更改通知的同時(shí)發(fā)送觀察者相應(yīng)通知所需的一切被觀察者內(nèi)部的信息,而Pull模型則是被觀察者只簡(jiǎn)單地告訴觀察者狀態(tài)發(fā)生了改變,觀察者需要再次向被觀察者查詢才可以做下一步的響應(yīng)動(dòng)作,兩者所使用的場(chǎng)合是不一樣的,具體而言,Push模型用在它確定觀察者一定會(huì)作出響應(yīng),因此被觀察者只需一次到位發(fā)送全部消息,而Pull模型則考慮到觀察者眾多,未必每一個(gè)都需要相同的信息,另外也不是每一個(gè)都需要對(duì)通知作出響應(yīng))
在第三章,介紹了OO相關(guān)技術(shù)包括UML,其中提到了一個(gè)概念:在一個(gè)繼承體系中,良好的做法是越往上放越多的Code,而Data則放到越下層(子類or實(shí)現(xiàn)類)越好。文章是這樣解釋的:將公共代碼盡可能地放到繼承層次的上方這樣它可以被重用(和數(shù)據(jù)不同,在繼承的過(guò)程中,當(dāng)子類實(shí)例不需要使用的時(shí)候,代碼也不會(huì)有額外的cost),而數(shù)據(jù)元素則應(yīng)該放到越低越好,這樣你不會(huì)為不需使用的數(shù)據(jù)成員付出代價(jià)。如下圖:
第四章講的是一個(gè)電腦公司的銷售系統(tǒng),對(duì)配件的零售和各種搭配銷售,要求系統(tǒng)能夠統(tǒng)一對(duì)待,這里引入了Composite模式,這里不詳述,因?yàn)檫€是比較簡(jiǎn)單的。
第五章講的是Decorator模式,首先引入了一個(gè)漢堡店的系統(tǒng),介紹了組合爆炸的設(shè)計(jì),并引入Decorator,解決了這種問(wèn)題。
第六章講的是不同編程語(yǔ)言對(duì)模式的實(shí)現(xiàn)問(wèn)題,設(shè)計(jì)模式和習(xí)慣用法(idiom)比較起來(lái),后者是與特定語(yǔ)言相關(guān)的,而設(shè)計(jì)模式則是與語(yǔ)言無(wú)關(guān)的,這指的是支持OO的語(yǔ)言都支持設(shè)計(jì)模式,只不過(guò)實(shí)現(xiàn)起來(lái)的復(fù)雜程度各有不同,文章舉了一個(gè)例子用VB來(lái)實(shí)現(xiàn)State模式,再用Java來(lái)實(shí)現(xiàn),得出上述結(jié)論。
第七章第八章我就沒詳細(xì)看了,一是覺得這里的圖用的不是標(biāo)準(zhǔn)UML圖,看起來(lái)不太順眼,另一個(gè)則是內(nèi)容似乎沒什么特別的。書的最后三分之一都是附錄:代碼。
總的而言,這本書不算一本經(jīng)典的書,由于在圖書館借的,在還書之前翻了一下。下次打算看的模式書是《Head First Design Pattern》。不過(guò)得答辯之后才有時(shí)間了。