出版時間:2007-12 出版社:清華大學(xué)出版社 作者:程杰 頁數(shù):368
Tag標(biāo)簽:無
前言
本書是一本程序集?NO。本書是一本故事集?NO。本書是一本通過故事講述程序如何設(shè)計(jì)的方法集。本書是給連Hello World都沒寫過的非程序員看的書嗎?NO。本書是給玩過穿孔紙帶(0/1)、寫過匯編、BASIC、C、C++、Delphi、Java、C#等語言,開發(fā)過覆蓋全球、使用人數(shù)過億、數(shù)百萬行代碼等大型系統(tǒng)的骨灰級程序員看的書嗎?NO。本書希望能給渴望了解OO世界的初學(xué)者、困惑于僵硬、脆弱、無法復(fù)用的代碼編程體驗(yàn)者、一直打著OO編程的旗號,做著過程式開發(fā)的基于對象的編程實(shí)踐者一些好的建議和提示。本書起因?qū)懕緯从谖乙淮巫雠嘤?xùn)的經(jīng)歷,學(xué)生大多是計(jì)算機(jī)專業(yè)的學(xué)生或有過一定經(jīng)驗(yàn)的在職開發(fā)者。他們都知道類、方法、構(gòu)造方法、甚至抽象類、接口等概念,并用 Visual Studio寫過不少的Windows或Web程序,可是當(dāng)我提問為什么要用面向?qū)ο?,它的好處在哪里時,卻沒有人能完整地講得出來,多數(shù)人的反應(yīng)是,概念知道的,就是表達(dá)不清楚。針對于此,我就舉了中國古代的四大發(fā)明中活字印刷的例子(見第1章),通過一個虛構(gòu)的三國曹操做詩的情景,把面向?qū)ο蟮膸状蠛锰幹v解了一下,學(xué)生普遍都感覺通俗易懂,覺得這樣的教學(xué)比直接告訴面向?qū)ο笥惺裁春锰幰尤菀桌斫夂陀洃?。這就使得我不斷地思考這樣一個問題,學(xué)一門技術(shù)是否需要趣味性、通俗性的引導(dǎo)。我在思考中發(fā)現(xiàn),看小說時,一般情況下我都可以完整地讀完它,而閱讀技術(shù)方面的圖書,卻很少有真正的每章每頁的仔細(xì)閱讀。盡管這兩者是有很大區(qū)別,技術(shù)書中可能有不少知識是已經(jīng)學(xué)會或暫時用不上的內(nèi)容,但也不得不承認(rèn),小說之所以可以堅(jiān)持讀完是因?yàn)閷λ信d趣,作者的文字吸引你。而有些技術(shù)書的枯燥乏味使得閱讀產(chǎn)生了困難,通常讀個前幾章就留待以后再說了。技術(shù)課的教學(xué)同樣如此,除非學(xué)生是抱著極大的學(xué)習(xí)動機(jī)來參與其中,否則照本宣科的教學(xué)、枯燥乏味的講解,學(xué)生一定會被龐雜的概念和復(fù)雜的邏輯攪暈了頭腦,致使效果大打折扣。也正因?yàn)榇?,往往造成部分學(xué)生,學(xué)了四年的計(jì)算機(jī)編程,卻可能連面向?qū)ο笥惺裁春锰幎歼€說不清。為什么不可以讓技術(shù)書帶點(diǎn)趣味性呢,哪怕這些趣味性與所講的技術(shù)并不十分貼切,只要不是影響技術(shù)核心的本質(zhì),不產(chǎn)生重大的錯誤,讓讀者能輕松閱讀它,并且有了一定的了解和感悟,這要比一本書寫得高深無比,卻被長期束之高閣要好得多。也正是這個原因,本人開始了關(guān)于設(shè)計(jì)模式的趣味性寫作的嘗試。本書讀者顯然本書不是給無任何編程經(jīng)驗(yàn)的人看的,對于想入這一行的朋友來說,找一門編程語言,從頭開始或許才是正道。而本書也不太適合有了多年面向?qū)ο箝_發(fā)經(jīng)驗(yàn),對常用的設(shè)計(jì)模式了如指掌的人看的。畢竟這里更多的是一些基礎(chǔ)性的東西。我時常拿程序員的成長與足球運(yùn)動員的成長做對比。GoF 的《設(shè)計(jì)模式》好比是世界頂級足球射門集錦,《重構(gòu)》、《敏捷軟件開發(fā)》、《設(shè)計(jì)模式解析》好比是一場場最精彩的足球比賽。我為之瘋狂,為之著迷??墒俏也⒉恢皇窍胱鲆粋€球迷(軟件使用者),而是更希望自己能成為一個足球運(yùn)動員(軟件設(shè)計(jì)編程者),能夠親自上場比賽,并且最終能成為球星(軟件架構(gòu)師)。我仔細(xì)地閱讀這些被譽(yù)為經(jīng)典的著作,認(rèn)真地實(shí)踐其中代碼,但是我總是半途而廢、堅(jiān)持不下去,我痛恨自己意志力的薄弱、憎惡自己無端地放棄,難道我真的就是那么的笨?痛定思痛,反思悔過。我終于發(fā)現(xiàn),貝利、馬拉多納不管老、胖是用來敬仰的,貝克漢姆、羅納爾迪尼奧不管美、丑是用來欣賞的,但他們的球技……嗨,客氣地說,是不容易學(xué)會的,客觀地說,是不可能學(xué)得會的。為什么會這樣?原來,我學(xué)習(xí)中缺了一個很重要的環(huán)節(jié),我們在看到了精彩的球賽,欣賞球星高超球技的同時,卻忽略了球星的成長過程。他們盡管有一定天分,但卻也是從最底層通過努力一點(diǎn)一點(diǎn)慢慢顯露出來的,我們需要的不僅僅是世界杯上的那定乾坤的一腳,更需要這一腳之前是如何練出那種神奇的方法,對于程序員來講,精彩的代碼是如何想出來的,要比看到精彩的代碼更加令人期待。本書顯然不是培養(yǎng)足球明星(軟件架構(gòu)師)的俱樂部,而是訓(xùn)練足球基本功的學(xué)校,培訓(xùn)的是初學(xué)足球的小球員(面向?qū)ο蟮某绦騿T),本書希望的是讀者閱讀后可以打好面向?qū)ο蟮幕A(chǔ),從而更加容易并深入的去理解和感受GoF的《設(shè)計(jì)模式》以及其他大師作品的魅力。本書定位本書是在學(xué)習(xí)眾多大師智慧結(jié)晶的圖書作品、分享了網(wǎng)上多位朋友的實(shí)踐經(jīng)驗(yàn)的基礎(chǔ)上,加之自己的編程感受寫出來的。正如牛頓有句名言:“如果說我比別人看得更遠(yuǎn)些,那是因?yàn)槲艺驹诹司奕说募缟??!钡@然,本書并沒有創(chuàng)造或發(fā)現(xiàn)什么模式,因此談不上站在巨人肩膀上看得更遠(yuǎn)。所以作者更希望本書能成為一些準(zhǔn)備攀登面向?qū)ο缶幊谈叻宓呐笥训牡巧揭啡?、提攜者,在您登山途中迷路時給予指引,在您峭壁攀巖摔跤時給予保護(hù)。本書特色本書有兩個特色,第一特色是重視過程。看了太多的計(jì)算機(jī)編程類的圖書,大多數(shù)書籍都是集中在講授優(yōu)秀的解決方案或者一個完美的程序樣例,但對這些解決方案和程序的演變過程卻重視不夠,好書之所以好,就是因?yàn)樽髡呖梢哉驹趯W(xué)習(xí)者的角度去講解問題所在,讓學(xué)習(xí)門檻降低?!吨貥?gòu)與模式》中有一句經(jīng)典之語:“如果想成為一名更優(yōu)秀的軟件設(shè)計(jì)師,了解優(yōu)秀軟件設(shè)計(jì)的演變過程比學(xué)習(xí)優(yōu)秀設(shè)計(jì)本身更有價值,因?yàn)樵O(shè)計(jì)的演變過程中蘊(yùn)藏著大智慧。”本人就希望能通過小菜與大鳥的對話,在不斷地提問與回答過程中,在程序的不斷重構(gòu)演變中,把設(shè)計(jì)模式的學(xué)習(xí)門檻降低,讓初學(xué)者可以更加容易地理解,為什么這樣設(shè)計(jì)才是好,是如何想到這樣設(shè)計(jì)的。本書的第二個特色就是貼近生活。盡管編程是嚴(yán)謹(jǐn)?shù)?,不容大話和戲說。但生活卻是多姿多彩的,而設(shè)計(jì)模式也不是完全孤立于現(xiàn)實(shí)世界而憑空想出來的理論。事實(shí)上所有的模式都可以在生活中找到對應(yīng)。因此,通過主人公小菜和大鳥的對話,將求職、面試、工作、交友、投資、兼職、辦公室文化、生活百味等等非常接近程序員生活原貌的場景寫到了書中,用一個個小故事來引出模式,會讓讀者相對輕松地進(jìn)入學(xué)習(xí)設(shè)計(jì)模式的狀態(tài)。當(dāng)然,此舉的最大目的還是為了深入淺出,而非純粹噱頭。本書內(nèi)容本書通篇都是以情景對話的形式,用一個又一個的小故事或編程示例來組織的。共分為四個部分。第一部分是面向?qū)ο蟮囊饬x和好處以及幾個重要的設(shè)計(jì)原則,通過小菜面試的失敗引出;第二部分是詳細(xì)講解23個設(shè)計(jì)模式;第三部分是對設(shè)計(jì)模式的總結(jié),利用小菜夢到的超級模式大賽的場景,把所有的面向?qū)ο蠛湍J礁拍疃紨M人化來趣味性的總結(jié)設(shè)計(jì)模式之間的異同和關(guān)鍵點(diǎn)。第四部分是附錄,主要是針對對面向?qū)ο蟛皇煜ぷx者的一個補(bǔ)充,通過一個例子的演變介紹了類、封裝、繼承、多態(tài)、接口、事件等概念。本書人物及背景小菜:原名蔡遙,22歲,上海人,上海某大學(xué)計(jì)算機(jī)專業(yè)大學(xué)四年級學(xué)生,成績一般,考研剛結(jié)束,即將畢業(yè),正求職找工作。大鳥:原名李大遼,29歲,小菜的表哥,云南昆明人,畢業(yè)后長期從事軟件開發(fā)和管理工作,近期到上海發(fā)展,借住小菜家在寶山的空套房內(nèi)。小菜以向大鳥學(xué)習(xí)為由,也從市區(qū)父母家搬到寶山與大鳥同住。本書研讀方法本書建議按順序閱讀,如果您感覺由于面向?qū)ο笾R的匱乏,例如對繼承、多態(tài)、接口、抽象類的理解不足,造成閱讀上的困難,不妨先閱讀附錄一的“培訓(xùn)實(shí)習(xí)生——面向?qū)ο蠡A(chǔ)”部分,然后再從第1章開始閱讀。如果您已經(jīng)對不少設(shè)計(jì)模式熟悉,也不妨挑選不熟悉的模式章節(jié)閱讀。盡管本書中的代碼都提供下載,但不經(jīng)過讀者的自己手動輸入過程,其實(shí)閱讀的效果是大打折扣的。強(qiáng)烈建議讀者根據(jù)樣例自己寫程序,只有在運(yùn)行出錯,達(dá)不到預(yù)期效果時再查看本書提供的源程序,這樣或許才是最好的學(xué)習(xí)方法。有問題可及時與我聯(lián)系。我的電子郵箱是chengjielong@163.com,博客是 http://cj723.cnblogs.com/。本書中的很多精華都來自許多大師作品,建議讀者通過筆記形式記錄,這將有助于您的記憶和理解設(shè)計(jì)模式,增強(qiáng)最終的讀書效果。本書中出現(xiàn)的“[ ]”是表示句子摘自某書。例如,“策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶[DP]?!逼渲小癧DP]”表示此名摘自《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,詳細(xì)摘要說明請參看附錄二。本書中29章中的虛擬人物姓名都是軟件編程中的專業(yè)術(shù)語,因此凡是專業(yè)術(shù)語被指向人物姓名的都用斜體字表示,以和實(shí)際術(shù)語區(qū)分。例如,“第一位是我們OOTV創(chuàng)始人,面向?qū)ο笙壬?,這里的斜體字面向?qū)ο笾溉嗣?。關(guān)于本書學(xué)習(xí)的疑問解答看本書需要什么基礎(chǔ)?主要是C#或其他編程語言的基礎(chǔ)知識,如變量、分支判斷、循環(huán)、函數(shù)等編程基礎(chǔ),關(guān)于面向?qū)ο蠡A(chǔ)可參看本書的附錄一。設(shè)計(jì)模式是否有必要全部學(xué)一遍?答案是,Yes!別被那些說什么設(shè)計(jì)模式大多用不上,根本不用全學(xué)的輿論所左右。盡管現(xiàn)在設(shè)計(jì)模式遠(yuǎn)遠(yuǎn)不止23種,對所有都有研究是不太容易的,但就像作者本人一樣,在學(xué)習(xí)GoF總結(jié)的23個設(shè)計(jì)模式過程中,你會被那些編程大師們進(jìn)行偉大的技術(shù)思想洗禮,不斷增加自己對面向?qū)ο蟮纳钊肜斫?,從而更好的把這種思想發(fā)揚(yáng)光大。這就如同高中時學(xué)立體幾何感覺沒用,但當(dāng)你裝修好房子購買家俱時才知道,有空間感,懂得空間計(jì)算是如何的重要,你完全可能遇到買了一個大號的冰箱卻放不進(jìn)廚房,或買了開關(guān)門的衣櫥(移門不占空間)卻因床在旁邊堵住了門而打不開的尷尬。重要的不是你將來會不會用到這些模式,而是通過這些模式讓你找到“封裝變化”、“對象間松散耦合”、“針對接口編程”的感覺,從而設(shè)計(jì)出易維護(hù)、易擴(kuò)展、易復(fù)用、靈活性好的程序。成為詩人后可能不需要刻意地按照某種模式去創(chuàng)作,但成為詩人前他們一定是認(rèn)真地研究過成百上千的唐詩宋詞、古今名句。如果說,數(shù)學(xué)是思維的體操,那設(shè)計(jì)模式,就是面向?qū)ο缶幊趟季S的體操。我學(xué)了設(shè)計(jì)模式后時常會過度設(shè)計(jì),如何辦?作者建議,暫時現(xiàn)象,繼續(xù)努力。設(shè)計(jì)模式有四境界:1.沒學(xué)前是一點(diǎn)不懂,根本想不到用設(shè)計(jì)模式,設(shè)計(jì)的代碼很糟糕;2.學(xué)了幾個模式后,很開心,于是到處想著要用自己學(xué)過的模式,于是時常造成誤用模式而不 自知;3.學(xué)完全部模式時,感覺諸多模式極其相似,無法分清模式之間的差異,有困惑,但深知誤用之害,應(yīng)用之時有所猶豫;4.靈活應(yīng)用模式,甚至不應(yīng)用具體的某種模式也能設(shè)計(jì)出非常優(yōu)秀的代碼,以達(dá)到無劍勝有劍的境界。從作者本人的觀點(diǎn)來說,不會用設(shè)計(jì)模式的人要遠(yuǎn)遠(yuǎn)超過過度使用設(shè)計(jì)模式的人,從這個角度講,因?yàn)榕逻^度設(shè)計(jì)而不用設(shè)計(jì)模式顯然是因噎廢食。當(dāng)你認(rèn)識到自己有過度使用模式的時候,那就證明你已意識到問題的存在,只有通過不斷的鉆研和努力,你才能突破“不識廬山真面目,只緣身在此山中”的瓶頸,達(dá)到“會當(dāng)凌絕頂,一覽眾山小”的境界。編程語言的差異本書講的是面向?qū)ο笤O(shè)計(jì)模式,是用.NET中的C#語言編寫,但本書并不是主要講解C#語言或.NET框架的圖書,因此本書同樣適合Java、VB.NET、C++等其他一些面向?qū)ο笳Z言的讀者閱讀來學(xué)習(xí)設(shè)計(jì)模式。就Java而言,主要差異來自C#對于子類繼承父類或?qū)崿F(xiàn)接口用的都是“:”,而Java中兩者是有區(qū)別的。當(dāng)Cat繼承抽象類Animal時,Java語法是public class Cat extends Animal當(dāng)Superman實(shí)現(xiàn)接口IFly時,Java語法是public class Superman implements IFly然后Java中所有的方法都是虛擬的,因此不用指定new或是override修飾符。還有一些其他差異,但基本都不影響本書的閱讀。對于VB.NET的程序員,如果閱讀困難,不妨去網(wǎng)上查找關(guān)于轉(zhuǎn)換C#與VB.Net語言的工具,比如http://www.kamalpatel.net/ConvertCSharp2VB.aspx,將下載本書的源代碼轉(zhuǎn)換后再進(jìn)行閱讀。C++的程序員,可能在語言上會有些差異,不過本書應(yīng)該不會因?yàn)檎Z言造成對面向?qū)ο笏枷氲恼`讀。不是一個人在戰(zhàn)斗首先要感謝我的妻子李秀芳對我寫作本書期間的全力支持,沒有她的理解和鼓勵,就不可能有本書的出版。而我們的寶寶也將在2008年初出生,希望等寶寶懂事后能知道,在寶寶的母親懷胎過程中,寶寶的父親也在為書的誕生而努力。也希望本書成為贈送給他或者她的最好的禮物。父母的養(yǎng)育才有作者本人的今天,本書的出版,尋根溯源,也是父母用心教育的結(jié)果。養(yǎng)育之恩,沒齒難忘。本書起源于本人在“博客園”網(wǎng)站的博客http://cj723.cnblogs.com/中的一個連載文章《小菜編程成長記》。沒想到連載引起了不小的反應(yīng),網(wǎng)友們普遍認(rèn)為本人的這種技術(shù)寫作方式新穎、有趣、喜歡看。正是因?yàn)楸姸嗑W(wǎng)友的支持,本人有了要把GoF的23種設(shè)計(jì)模式全部成文的沖動。非常感謝這些在博客回復(fù)中鼓勵我的朋友。這里需要特別提及洪立人先生,他是本人在寫書期間共同為理想奮斗的戰(zhàn)友,寫作也得到了他的大力支持和幫助,我寫作的不少妙句也來自我們倆共同合作的網(wǎng)站http://www.miaoju.net。在此對兩位表示衷心的感謝。寫作過程中,本人參考了許多國內(nèi)外大師的設(shè)計(jì)模式的著作。尤其是《設(shè)計(jì)模式》(作者:簡稱GoF的Erich Gamm,Richard Helm,Ralph Johnson,John Vlissides)、《設(shè)計(jì)模式解析》(作者:Alan Shalloway,James R. Trott)、《敏捷軟件開發(fā):原則、模式與實(shí)踐》(作者:Robert C.Martin)、《重構(gòu)——改善既有代碼的設(shè)計(jì)》(作者:Martin Fowler)、《重構(gòu)與模式》(作者:Joshua Kerievsky)、《Java與模式》(作者:閻宏等等,沒有他們的貢獻(xiàn),就沒有本書的出版。也希望本書能成為更好閱讀他們這些大師作品的前期讀物。寫作過程中,本人還參考了http://www.dofactory.com/ 關(guān)于23個設(shè)計(jì)模式的講解,并引用了他們的結(jié)構(gòu)圖和基本代碼。在博客園中的許多朋友,比如張逸、呂震宇、李會軍、idior、Allen Lee的博文,MSDN SmartCast中李建忠的講座,CSDN博客中的大衛(wèi)、ai92的博文,網(wǎng)站J道www.jdon.com 的版主banq的文章都給本人的寫作提供了非常大的指引和幫助,在此表示感謝。另外博客園的雙魚座先生還對本人的部分代碼提出了整改意見,也表示衷心的謝意。詳細(xì)參考資料與網(wǎng)站鏈接,見附錄二。事實(shí)上,由于本人長期有看書記讀書筆記的習(xí)慣,所以書中引用筆記的內(nèi)容,也極有可能是來自某本書或者某個朋友的博客、某個網(wǎng)站的文章。而本人已經(jīng)無法一一說出其引用的地址,但這些作者的智慧同樣對本書的寫作帶來了幫助,在此只能說聲謝謝。最后,對本書的責(zé)任編輯陳冰先生及清華大學(xué)出版社的相關(guān)工作人員,表示由衷的感謝。本書的出版離不開陳先生的指導(dǎo)和其他工作人員的辛勤工作。程 杰2007年7月序這本書最初起源于作者程杰在其博客中所寫的連載文章——《小菜編程成長記》。隨著文章的一篇篇發(fā)布,這些文章新穎的表現(xiàn)形式和獨(dú)特的風(fēng)格受到了眾多讀者的關(guān)注和喜愛,很多人在博客中留下了評語。有些雖然只有短短的一句話,但也可以看出是對作者由衷的感謝。作為本書的策劃編輯,最初我也是在博客園中瀏覽博文時閱讀到這些文章的,我的直覺和網(wǎng)友們熱情洋溢的評語告訴我,這些文章有作為一部書出版的價值,于是我就聯(lián)系了程杰。幾個月后,我拿到了這部書的初稿。初審后,我發(fā)現(xiàn)書稿中存在一些問題。比如,當(dāng)時書稿中還沒有對UML類圖進(jìn)行講解的內(nèi)容,這會導(dǎo)致初學(xué)者學(xué)習(xí)后面的內(nèi)容時感到理解困難,于是我請作者在第1 章中增加了UML類圖這一節(jié),這是簡潔卻精彩的一節(jié);另外,當(dāng)時作者為了便于表達(dá)某些舉例的含義,有相當(dāng)數(shù)量的代碼都是用中文編寫的,雖然中文代碼看似易懂,但卻會令絕大多數(shù)早已熟悉了英文代碼的程序員們感到困惑和難以閱讀,所以我請作者把代碼改回為程序員們所熟悉的英文代碼,并同時添加了更詳細(xì)的中文注釋。經(jīng)過幾番認(rèn)真和辛苦的修改與調(diào)整,現(xiàn)在,這本書在你的手中了。對于這本書,我想說的是,其中的很多篇章非常的精彩,會令你禁不住叫好,但也有一些篇章會顯得有些拖沓,或者是有些牽強(qiáng),然而,隨著你讀過那些精彩的段落,讀過那些不那么精彩的段落,最終,你會讀到書的最后一頁(很多書不能使你做到這一點(diǎn)),當(dāng)你讀完全書時,你會發(fā)現(xiàn),你的心情很愉快,很平靜,即使是那些當(dāng)時看起來不那么精彩的段落,現(xiàn)在也都成為了這溫馨故事的一部分。你會記得書中那個好學(xué)、天真、而又執(zhí)著的小菜,也會記得那個善于啟發(fā),經(jīng)驗(yàn)老道的大鳥。下面這些是來自作者博客的網(wǎng)友評論,看完這些熱情洋溢的評論,就和作者一起,進(jìn)入設(shè)計(jì)模式的大話境界吧。本書策劃編輯 陳冰2007年10月18日網(wǎng)友評論daigua:看到這篇精彩的成長記,我連飯都不想吃了,什么事都不想做,就想把它看完。寫得太好了!是啊,現(xiàn)在很多教材都太枯燥了,不好理解。其實(shí)書的意義就在于讓人學(xué)到知識,而不在于用什么方式,為什么一定要那么教條呢,只要能讓人比較容易地學(xué)到書里的知識就是一本好書。謝謝你啊,給了我很大的信心。我現(xiàn)在很有信心把編程進(jìn)行到底,哈哈。光頭小松鼠:絕對經(jīng)典!一篇小故事,把程序的靈活性、可擴(kuò)展性、可維護(hù)、可復(fù)用等說得怎一個妙字了得!沉默天蝎:感激,讓我這個菜鳥頓悟。這樣的寫法太好了,如果老大你出書,我肯定購買!碳碳:這種學(xué)習(xí)的方式真的很神奇,盡管每個人都能想到,但不是每個人都能做到?;蛟S可以把系列文章歸檔出書,說不定會收到追捧,呵呵。Bryant:真的是太棒了!我原來看過一些有關(guān)設(shè)計(jì)模式的書,都覺得太抽象,根本就不能理解,也不知道啥時候能用上。看過你寫的這些文章,才知道了應(yīng)該怎樣在實(shí)際中運(yùn)用這些模式,而且文筆非常的幽默,享受!Thx ^_^ 支持!有個建議,最好慢慢地把所有的設(shè)計(jì)模式都聊聊!Bryant:不錯,樓主說的非常幽默,通俗,把我們一步一步帶入面向?qū)ο蟮氖澜?thx ^_^Bryant:太棒了,我正是這樣初學(xué)設(shè)計(jì)模式的小菜,需要這樣的文章,謝謝樓主!菜鳥飛:樓主,加油,支持你。在這里獻(xiàn)上崇高的敬意,不管你有沒有感受到我摯熱的目光。請你相信,有這樣一些人一直在默默地關(guān)注著你,期待著你。wdx2008:非常好?。?!幽默,搞笑,易懂,真神人也,鬼神不可測!支持樓主??!空明流轉(zhuǎn):呵呵,樓主說得蠻好。國外的文章好就好在有例子,“廢話”多,所以比較好理解。至于行文風(fēng)格嘛,這個倒是因人而異的。我個人就偏向于論文式的行文風(fēng)格,邏輯嚴(yán)密,層層遞進(jìn),闡述也很清晰。就有點(diǎn)像有序數(shù)組,二分法就能輕松查找到自己想要的東西,但國內(nèi)的那種論文式的文章,呵呵,我看是賣弄的成分居多,實(shí)作的成分偏少,所以才那么難讀的吧。Char:現(xiàn)在的大學(xué)就缺少這種既通俗易懂,又有內(nèi)容的東西。Apple:不錯,學(xué)習(xí)了。希望博主能再接再厲多寫點(diǎn),看了很多書都沒有看你的文章明白得快。SnowDoggie:呵呵,挺好的。其實(shí)要想找個絕對沒有漏洞的例子是很辛苦的,關(guān)鍵在于文章本身能說明問題,能體現(xiàn)作者的意圖就足夠了。昨天和朋友一起爬山的時候還討論了你的文章風(fēng)格,其實(shí)最有用的還是你這種寓教于樂,步步深入的風(fēng)格,陽春白雪的經(jīng)典雖然是經(jīng)典,大眾卻不見得喜歡。Jerry:不錯的文章,簡單明了,又不乏趣味,好的文章就得頂下。izhizhe2000:很好,整個系列寫完之后可以出書了,保證受大學(xué)生的廣泛歡迎!mekong:很是欣賞這樣幽默風(fēng)趣又不失睿智深刻的文字。Wuyisky:呵呵,樓主不僅程序?qū)懙煤?,而且還有文學(xué)天賦。佩服!Jack:真正的高手是用最生動的語言,最簡單的例子,這才是真正的“深入淺出”。贊?。。±闲?,加油,繼續(xù)喲。BoyLee:人才,愛死你了。做了一年外包,沒技術(shù)含量。正打算從頭學(xué)習(xí)這些東西,這樣的方式我最喜歡了。Leoxu:很不錯,對正在找工作的我有很大的幫助。以后會多來光顧。Ame:寫得承上啟下,始終有一主干線貫穿,作者的文字功底很強(qiáng)??!Artech:我很喜歡你的寫作風(fēng)格!以一種調(diào)侃的方式講明一個深奧的問題。我一直在嘗試如何以一種讓每個人都懂得的語言來向大家分享我所理解的.NET。你給了我一個啟發(fā)。8:醍醐灌頂!感謝,領(lǐng)悟了不少東西!??!Yufengly:真是太容易理解了,而且看后印象深刻,繼續(xù)努力!期待下文……支持作者!Sopper:支持,例子舉得很形象,寫得很棒,以后會常來關(guān)注。d:會技術(shù)的高人有很多,但能把技術(shù)講得如此通俗易懂的高人并不多,你是一個,謝謝~~~white.wu:非常喜歡您這種授人以“漁”的文章。Answer:強(qiáng)啊,本菜鳥受益很大,謝謝。Hanlei:強(qiáng),很受益啊,感謝樓主,寫出這么好的文章來。金色海洋(jyk):繼續(xù)呀,我們期待中……,寫得很好,一看就懂。DSharp:看博客園這么久了,終于看到一篇有中國特色的好文。
內(nèi)容概要
本書通篇都是以情景對話的形式,用多個小故事或編程示例來組織講解GoF(設(shè)計(jì)模式的經(jīng)典名著——Design Patterns:Elements of Reusable Object-Oriented Software,中譯本名為《設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)》的四位作者Erich Gamma、Richard Helm、Ralph Johnson,以及John Vlissides,這四人常被稱為Gang of Four,即四人組,簡稱GoF)總結(jié)的23個設(shè)計(jì)模式。本書共分為29章。其中,第1、3、4、5章著重講解了面向?qū)ο蟮囊饬x、好處以及幾個重要的設(shè)計(jì)原則;第2章,以及第6到第28章詳細(xì)講解了23個設(shè)計(jì)模式;第29章是對設(shè)計(jì)模式的全面總結(jié)。附錄部分是通過一個例子的演變?yōu)槌鯇W(xué)者介紹了面向?qū)ο蟮幕靖拍睢1緯奶厣峭ㄟ^小菜與大鳥的趣味問答,在講解程序的不斷重構(gòu)和演變過程中,把設(shè)計(jì)模式的學(xué)習(xí)門檻降低,讓初學(xué)者可以更加容易地理解——為什么這樣設(shè)計(jì)才是好的?是怎樣想到這樣設(shè)計(jì)的?以達(dá)到不但授之以“魚”,還授之以“漁”的目的。引導(dǎo)讀者體會設(shè)計(jì)演變過程中蘊(yùn)藏的大智慧?! ”緯m合編程初學(xué)者或希望在面向?qū)ο缶幊躺嫌兴岣叩拈_發(fā)人員閱讀。
作者簡介
程杰,高級軟件工程師&高級培訓(xùn)講師。從事軟件開發(fā)一線工作近八年時間。曾在申銀萬國證券公司、上海楊浦區(qū)政府、朝華集團(tuán)下屬網(wǎng)游公司、香港晨興集團(tuán)等多行業(yè)項(xiàng)目開發(fā)中擔(dān)任主程及項(xiàng)目負(fù)責(zé)人,有豐富的大中型軟件開發(fā)經(jīng)驗(yàn),以及多年的軟件設(shè)計(jì)與項(xiàng)目管理經(jīng)驗(yàn)。曾任加拿大慧
書籍目錄
第1章 代碼無錯就是優(yōu)?——簡單工廠模式 1.1 面試受挫 1.2 初學(xué)者代碼毛病 1.3 代碼規(guī)范 1.4 面向?qū)ο缶幊? 1.5 活字印刷,面向?qū)ο? 1.6 面向?qū)ο蟮暮锰? 1.7 復(fù)制vs.復(fù)用 1.8 業(yè)務(wù)的封裝 1.9 緊耦合vs.松耦合 1.10 簡單工廠模式 1.11 UML類圖 第2章 商場促銷——策略模式 2.1 商場收銀軟件 2.2 增加打折 2.3 簡單工廠實(shí)現(xiàn) 2.4 策略模式 2.5 策略模式實(shí)現(xiàn) 2.6 策略與簡單工廠結(jié)合 2.7 策略模式解析 第3章 拍攝UFO——單一職責(zé)原則 3.1 新手機(jī) 3.2 拍攝 3.3 沒用的東西 3.4 單一職責(zé)原則 3.5 方塊游戲的設(shè)計(jì) 3.6 手機(jī)職責(zé)過多嗎? 第4章 考研求職兩不誤——開放-封閉原則 4.1 考研失敗 4.2 開放-封閉原則 4.3 何時應(yīng)對變化 4.4 兩手準(zhǔn)備,并全力以赴 第5章 會修電腦不會修收音機(jī)?——依賴倒轉(zhuǎn)原則 5.1 MM請求修電腦 5.2 電話遙控修電腦 5.3 依賴倒轉(zhuǎn)原則 5.4 里氏代換原則 5.5 修收音機(jī) 第6章 穿什么有這么重要?——裝飾模式 6.1 穿什么有這么重要? 6.2 小菜扮靚第一版 6.3 小菜扮靚第二版 6.4 裝飾模式 6.5 小菜扮靚第三版 6.6 裝飾模式總結(jié) 第7章 為別人做嫁衣——代理模式 7.1 為別人做嫁衣! 7.2 沒有代理的代碼 7.3 只有代理的代碼 7.4 符合實(shí)際的代碼 7.5 代理模式 7.6 代理模式應(yīng)用 7.7 秀才讓小六代其求婚 第8章 雷鋒依然在人間——工廠方法模式 8.1 再現(xiàn)活雷鋒 8.2 簡單工廠模式實(shí)現(xiàn) 8.3 工廠方法模式實(shí)現(xiàn) 8.4 簡單工廠vs.工廠方法 8.5 雷鋒工廠 第9章 簡歷復(fù)印——原型模式 9.1 夸張的簡歷 9.2 簡歷代碼初步實(shí)現(xiàn) 9.3 原型模式 9.4 簡歷的原型實(shí)現(xiàn) 9.5 淺復(fù)制與深復(fù)制 9.6 簡歷的深復(fù)制實(shí)現(xiàn) 9.7 復(fù)制簡歷vs.手寫求職信 第10章 考題抄錯會做也白搭——模板方法模式 10.1 選擇題不會做,蒙唄! 10.2 重復(fù)=易錯+難改 10.3 提煉代碼 10.4 模板方法模式 10.5 模板方法模式特點(diǎn) 10.6 主觀題,看你怎么蒙 第11章 無熟人難辦事?——迪米特法則 11.1 第一天上班 11.2 無熟人難辦事 11.3 迪米特法則 第12章 牛市股票還會虧錢?——外觀模式 12.1 牛市股票還會虧錢? 12.2 股民炒股代碼 12.3 投資基金代碼 12.4 外觀模式 12.5 何時使用外觀模式 第13章 好菜每回味不同——建造者模式 13.1 炒面沒放鹽 13.2 建造小人一 13.3 建造小人二 13.4 建造者模式 13.5 建造者模式解析 13.6 建造者模式基本代碼 第14章 老板回來,我不知道——觀察者模式 14.1 老板回來?我不知道! 14.2 雙向耦合的代碼 14.3 解耦實(shí)踐一 14.4 解耦實(shí)踐二 14.5 觀察者模式 14.6 觀察者模式特點(diǎn) 14.7 觀察者模式的不足 14.8 事件委托實(shí)現(xiàn) 14.9 事件委托說明 14.10 石守吉失手機(jī)后的委托 第15章 就不能不換DB嗎?——抽象工廠模式 15.1 就不能不換DB嗎? 15.2 最基本的數(shù)據(jù)訪問程序 15.3 用了工廠方法模式的數(shù)據(jù)訪問程序 15.4 用了抽象工廠模式的數(shù)據(jù)訪問程序 15.5 抽象工廠模式 15.6 抽象工廠模式的優(yōu)點(diǎn)與缺點(diǎn) 15.7 用簡單工廠來改進(jìn)抽象工廠 15.8 用反射+抽象工廠的數(shù)據(jù)訪問程序 15.9 用反射+配置文件實(shí)現(xiàn)數(shù)據(jù)訪問程序 15.10 無癡迷,不成功 第16章 無盡加班何時休——狀態(tài)模式 16.1 加班,又是加班! 16.2 工作狀態(tài)-函數(shù)版 16.3 工作狀態(tài)-分類版 16.4 方法過長是壞味道 16.5 狀態(tài)模式 16.6 狀態(tài)模式好處與用處 16.7 工作狀態(tài)-狀態(tài)模式版 第17章 在NBA我需要翻譯——適配器模式 17.1 在NBA我需要翻譯! 17.2 適配器模式 17.3 何時使用適配器模式 17.4 籃球翻譯適配器 17.5 適配器模式的.NET應(yīng)用 17.6 扁鵲的醫(yī)術(shù) 第18章 如果再回到從前——備忘錄模式 18.1 如果再給我一次機(jī)會…… 18.2 游戲存進(jìn)度 18.3 備忘錄模式 18.4 備忘錄模式基本代碼 18.5 游戲進(jìn)度備忘 第19章 分公司=一部門——組合模式 19.1 分公司不就是一部門嗎? 19.2 組合模式 19.3 透明方式與安全方式 19.4 何時使用組合模式 19.5 公司管理系統(tǒng) 19.6 組合模式好處 第20章 想走?可以!先買票——迭代器模式 20.1 乘車買票,不管你是誰! 20.2 迭代器模式 20.3 迭代器實(shí)現(xiàn) 20.4 .NET的迭代器實(shí)現(xiàn) 20.5 迭代高手 第21章 有些類也需計(jì)劃生育——單例模式 21.1 類也需要計(jì)劃生育 21.2 判斷對象是否是null 21.3 生還是不生是自己的責(zé)任 21.4 單例模式 21.5 多線程時的單例 21.6 雙重鎖定 21.7 靜態(tài)初始化 第22章 手機(jī)軟件何時統(tǒng)一——橋接模式 22.1 憑什么你的游戲我不能玩 22.2 緊耦合的程序演化 22.3 合成/聚合復(fù)用原則 22.4 松耦合的程序 22.5 橋接模式 22.6 橋接模式基本代碼 22.7 我要開發(fā)“好”游戲 第23章 烤羊肉串引來的思考——命令模式 23.1 吃烤羊肉串! 23.2 燒烤攤vs.燒烤店 23.3 緊耦合設(shè)計(jì) 23.4 松耦合設(shè)計(jì) 23.5 松耦合后 23.6 命令模式 23.7 命令模式作用 第24章 加薪非要老總批?——職責(zé)鏈模式 24.1 老板,我要加薪! 24.2 加薪代碼初步 24.3 職責(zé)鏈模式 24.4 職責(zé)鏈的好處 24.5 加薪代碼重構(gòu) 24.6 加薪成功 第25章 世界需要和平——中介者模式 25.1 世界需要和平! 25.2 中介者模式 25.3 安理會做中介 25.4 中介者模式優(yōu)缺點(diǎn) 第26章 項(xiàng)目多也別傻做——享元模式 26.1 項(xiàng)目多也別傻做! 26.2 享元模式 26.3 網(wǎng)站共享代碼 26.4 內(nèi)部狀態(tài)與外部狀態(tài) 26.5 享元模式應(yīng)用 第27章 其實(shí)你不懂老板的心——解釋器模式 27.1 其實(shí)你不懂老板的心 27.2 解釋器模式 27.3 解釋器模式好處 27.4 音樂解釋器 27.5 音樂解釋器實(shí)現(xiàn) 27.6 料事如神 第28章 男人和女人——訪問者模式 28.1 男人和女人! 28.2 最簡單的編程實(shí)現(xiàn) 28.3 簡單的面向?qū)ο髮?shí)現(xiàn) 28.4 用了模式的實(shí)現(xiàn) 28.5 訪問者模式 28.6 訪問者模式基本代碼 28.7 比上不足,比下有余 第29章 OOTV杯超級模式大賽——模式總結(jié) 29.1 演講任務(wù) 29.2 報名參賽 29.3 超模大賽開幕式 29.4 創(chuàng)建型模式比賽 29.5 結(jié)構(gòu)型模式比賽 29.6 行為型模式一組比賽 29.7 行為型模式二組比賽 29.8 決賽 29.9 夢醒時分 29.10 沒有結(jié)束的結(jié)尾 附錄 A 培訓(xùn)實(shí)習(xí)生——面向?qū)ο蠡A(chǔ) A.1 培訓(xùn)實(shí)習(xí)生 A.2 類與實(shí)例 A.3 構(gòu)造方法 A.4 方法重載 A.5 屬性與修飾符 A.6 封裝 A.7 繼承 A.8 多態(tài) A.9 重構(gòu) A.10 抽象類 A.11 接口 A.12 集合 A.13 泛型 A.14 委托與事件 A.15 客套 附錄 B 參考文獻(xiàn)
章節(jié)摘錄
插圖:
媒體關(guān)注與評論
前言本書是一本程序集?NO。本書是一本故事集?NO。本書是一本通過故事講述程序如何設(shè)計(jì)的方法集。本書是給連Hello World都沒寫過的非程序員看的書嗎?NO。本書是給玩過穿孔紙帶(0/1)、寫過匯編、BASIC、C、C++、Delphi、Java、C#等語言,開發(fā)過覆蓋全球、使用人數(shù)過億、數(shù)百萬行代碼等大型系統(tǒng)的骨灰級程序員看的書嗎?NO。本書希望能給渴望了解OO世界的初學(xué)者、困惑于僵硬、脆弱、無法復(fù)用的代碼編程體驗(yàn)者、一直打著OO編程的旗號,做著過程式開發(fā)的基于對象的編程實(shí)踐者一些好的建議和提示。本書起因?qū)懕緯从谖乙淮巫雠嘤?xùn)的經(jīng)歷,學(xué)生大多是計(jì)算機(jī)專業(yè)的學(xué)生或有過一定經(jīng)驗(yàn)的在職開發(fā)者。他們都知道類、方法、構(gòu)造方法、甚至抽象類、接口等概念,并用Visual Studio寫過不少的Windows或Web程序,可是當(dāng)我提問為什么要用面向?qū)ο螅暮锰幵谀睦飼r,卻沒有人能完整地講得出來,多數(shù)人的反應(yīng)是,概念知道的,就是表達(dá)不清楚。針對于此,我就舉了中國古代的四大發(fā)明中活字印刷的例子(見第1章),通過一個虛構(gòu)的三國曹操做詩的情景,把面向?qū)ο蟮膸状蠛锰幹v解了一下,學(xué)生普遍都感覺通俗易懂,覺得這樣的教學(xué)比直接告訴面向?qū)ο笥惺裁春锰幰尤菀桌斫夂陀洃?。這就使得我不斷地思考這樣一個問題,學(xué)一門技術(shù)是否需要趣味性、通俗性的引導(dǎo)。我在思考中發(fā)現(xiàn),看小說時,一般情況下我都可以完整地讀完它,而閱讀技術(shù)方面的圖書,卻很少有真正的每章每頁的仔細(xì)閱讀。盡管這兩者是有很大區(qū)別,技術(shù)書中可能有不少知識是已經(jīng)學(xué)會或暫時用不上的內(nèi)容,但也不得不承認(rèn),小說之所以可以堅(jiān)持讀完是因?yàn)閷λ信d趣,作者的文字吸引你。而有些技術(shù)書的枯燥乏味使得閱讀產(chǎn)生了困難,通常讀個前幾章就留待以后再說了。技術(shù)課的教學(xué)同樣如此,除非學(xué)生是抱著極大的學(xué)習(xí)動機(jī)來參與其中,否則照本宣科的教學(xué)、枯燥乏味的講解,學(xué)生一定會被龐雜的概念和復(fù)雜的邏輯攪暈了頭腦,致使效果大打折扣。也正因?yàn)榇?,往往造成部分學(xué)生,學(xué)了四年的計(jì)算機(jī)編程,卻可能連面向?qū)ο笥惺裁春锰幎歼€說不清。為什么不可以讓技術(shù)書帶點(diǎn)趣味性呢,哪怕這些趣味性與所講的技術(shù)并不十分貼切,只要不是影響技術(shù)核心的本質(zhì),不產(chǎn)生重大的錯誤,讓讀者能輕松閱讀它,并且有了一定的了解和感悟,這要比一本書寫得高深無比,卻被長期束之高閣要好得多。也正是這個原因,本人開始了關(guān)于設(shè)計(jì)模式的趣味性寫作的嘗試。本書讀者顯然本書不是給無任何編程經(jīng)驗(yàn)的人看的,對于想入這一行的朋友來說,找一門編程語言,從頭開始或許才是正道。而本書也不太適合有了多年面向?qū)ο箝_發(fā)經(jīng)驗(yàn),對常用的設(shè)計(jì)模式了如指掌的人看的。畢竟這里更多的是一些基礎(chǔ)性的東西。我時常拿程序員的成長與足球運(yùn)動員的成長做對比。GoF的《設(shè)計(jì)模式》好比是世界頂級足球射門集錦,《重構(gòu)》、《敏捷軟件開發(fā)》、《設(shè)計(jì)模式解析》好比是一場場最精彩的足球比賽。我為之瘋狂,為之著迷??墒俏也⒉恢皇窍胱鲆粋€球迷(軟件使用者),而是更希望自己能成為一個足球運(yùn)動員(軟件設(shè)計(jì)編程者),能夠親自上場比賽,并且最終能成為球星(軟件架構(gòu)師)。我仔細(xì)地閱讀這些被譽(yù)為經(jīng)典的著作,認(rèn)真地實(shí)踐其中代碼,但是我總是半途而廢、堅(jiān)持不下去,我痛恨自己意志力的薄弱、憎惡自己無端地放棄,難道我真的就是那么的笨?痛定思痛,反思悔過。我終于發(fā)現(xiàn),貝利、馬拉多納不管老、胖是用來敬仰的,貝克漢姆、羅納爾迪尼奧不管美、丑是用來欣賞的,但他們的球技……嗨,客氣地說,是不容易學(xué)會的,客觀地說,是不可能學(xué)得會的。為什么會這樣?原來,我學(xué)習(xí)中缺了一個很重要的環(huán)節(jié),我們在看到了精彩的球賽,欣賞球星高超球技的同時,卻忽略了球星的成長過程。他們盡管有一定天分,但卻也是從最底層通過努力一點(diǎn)一點(diǎn)慢慢顯露出來的,我們需要的不僅僅是世界杯上的那定乾坤的一腳,更需要這一腳之前是如何練出那種神奇的方法,對于程序員來講,精彩的代碼是如何想出來的,要比看到精彩的代碼更加令人期待。本書顯然不是培養(yǎng)足球明星(軟件架構(gòu)師)的俱樂部,而是訓(xùn)練足球基本功的學(xué)校,培訓(xùn)的是初學(xué)足球的小球員(面向?qū)ο蟮某绦騿T),本書希望的是讀者閱讀后可以打好面向?qū)ο蟮幕A(chǔ),從而更加容易并深入的去理解和感受GoF的《設(shè)計(jì)模式》以及其他大師作品的魅力。本書定位本書是在學(xué)習(xí)眾多大師智慧結(jié)晶的圖書作品、分享了網(wǎng)上多位朋友的實(shí)踐經(jīng)驗(yàn)的基礎(chǔ)上,加之自己的編程感受寫出來的。正如牛頓有句名言:“如果說我比別人看得更遠(yuǎn)些,那是因?yàn)槲艺驹诹司奕说募缟稀!钡@然,本書并沒有創(chuàng)造或發(fā)現(xiàn)什么模式,因此談不上站在巨人肩膀上看得更遠(yuǎn)。所以作者更希望本書能成為一些準(zhǔn)備攀登面向?qū)ο缶幊谈叻宓呐笥训牡巧揭啡?、提攜者,在您登山途中迷路時給予指引,在您峭壁攀巖摔跤時給予保護(hù)。本書特色本書有兩個特色,第一特色是重視過程。看了太多的計(jì)算機(jī)編程類的圖書,大多數(shù)書籍都是集中在講授優(yōu)秀的解決方案或者一個完美的程序樣例,但對這些解決方案和程序的演變過程卻重視不夠,好書之所以好,就是因?yàn)樽髡呖梢哉驹趯W(xué)習(xí)者的角度去講解問題所在,讓學(xué)習(xí)門檻降低?!吨貥?gòu)與模式》中有一句經(jīng)典之語:“如果想成為一名更優(yōu)秀的軟件設(shè)計(jì)師,了解優(yōu)秀軟件設(shè)計(jì)的演變過程比學(xué)習(xí)優(yōu)秀設(shè)計(jì)本身更有價值,因?yàn)樵O(shè)計(jì)的演變過程中蘊(yùn)藏著大智慧?!北救司拖M芡ㄟ^小菜與大鳥的對話,在不斷地提問與回答過程中,在程序的不斷重構(gòu)演變中,把設(shè)計(jì)模式的學(xué)習(xí)門檻降低,讓初學(xué)者可以更加容易地理解,為什么這樣設(shè)計(jì)才是好,是如何想到這樣設(shè)計(jì)的。本書的第二個特色就是貼近生活。盡管編程是嚴(yán)謹(jǐn)?shù)?,不容大話和戲說。但生活卻是多姿多彩的,而設(shè)計(jì)模式也不是完全孤立于現(xiàn)實(shí)世界而憑空想出來的理論。事實(shí)上所有的模式都可以在生活中找到對應(yīng)。因此,通過主人公小菜和大鳥的對話,將求職、面試、工作、交友、投資、兼職、辦公室文化、生活百味等等非常接近程序員生活原貌的場景寫到了書中,用一個個小故事來引出模式,會讓讀者相對輕松地進(jìn)入學(xué)習(xí)設(shè)計(jì)模式的狀態(tài)。當(dāng)然,此舉的最大目的還是為了深入淺出,而非純粹噱頭。本書內(nèi)容本書通篇都是以情景對話的形式,用一個又一個的小故事或編程示例來組織的。共分為四個部分。第一部分是面向?qū)ο蟮囊饬x和好處以及幾個重要的設(shè)計(jì)原則,通過小菜面試的失敗引出;第二部分是詳細(xì)講解23個設(shè)計(jì)模式;第三部分是對設(shè)計(jì)模式的總結(jié),利用小菜夢到的超級模式大賽的場景,把所有的面向?qū)ο蠛湍J礁拍疃紨M人化來趣味性的總結(jié)設(shè)計(jì)模式之間的異同和關(guān)鍵點(diǎn)。第四部分是附錄,主要是針對對面向?qū)ο蟛皇煜ぷx者的一個補(bǔ)充,通過一個例子的演變介紹了類、封裝、繼承、多態(tài)、接口、事件等概念。本書人物及背景小菜:原名蔡遙,22歲,上海人,上海某大學(xué)計(jì)算機(jī)專業(yè)大學(xué)四年級學(xué)生,成績一般,考研剛結(jié)束,即將畢業(yè),正求職找工作。大鳥:原名李大遼,29歲,小菜的表哥,云南昆明人,畢業(yè)后長期從事軟件開發(fā)和管理工作,近期到上海發(fā)展,借住小菜家在寶山的空套房內(nèi)。小菜以向大鳥學(xué)習(xí)為由,也從市區(qū)父母家搬到寶山與大鳥同住。本書研讀方法本書建議按順序閱讀,如果您感覺由于面向?qū)ο笾R的匱乏,例如對繼承、多態(tài)、接口、抽象類的理解不足,造成閱讀上的困難,不妨先閱讀附錄一的“培訓(xùn)實(shí)習(xí)生——面向?qū)ο蠡A(chǔ)”部分,然后再從第1章開始閱讀。如果您已經(jīng)對不少設(shè)計(jì)模式熟悉,也不妨挑選不熟悉的模式章節(jié)閱讀。 盡管本書中的代碼都提供下載,但不經(jīng)過讀者的自己手動輸入過程,其實(shí)閱讀的效果是大打折扣的。強(qiáng)烈建議讀者根據(jù)樣例自己寫程序,只有在運(yùn)行出錯,達(dá)不到預(yù)期效果時再查看本書提供的源程序,這樣或許才是最好的學(xué)習(xí)方法。有問題可及時與我聯(lián)系。我的電子郵箱是chengjielong@163.com,博客是http://cj723.cnblogs.com/。本書中的很多精華都來自許多大師作品,建議讀者通過筆記形式記錄,這將有助于您的記憶和理解設(shè)計(jì)模式,增強(qiáng)最終的讀書效果。本書中出現(xiàn)的“[ ]”是表示句子摘自某書。例如,“策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶[DP]?!逼渲小癧DP]”表示此名摘自《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,詳細(xì)摘要說明請參看附錄二。本書中29章中的虛擬人物姓名都是軟件編程中的專業(yè)術(shù)語,因此凡是專業(yè)術(shù)語被指向人物姓名的都用斜體字表示,以和實(shí)際術(shù)語區(qū)分。例如,“第一位是我們OOTV創(chuàng)始人,面向?qū)ο笙壬?,這里的斜體字面向?qū)ο笾溉嗣?。關(guān)于本書學(xué)習(xí)的疑問解答看本書需要什么基礎(chǔ)?主要是C#或其他編程語言的基礎(chǔ)知識,如變量、分支判斷、循環(huán)、函數(shù)等編程基礎(chǔ),關(guān)于面向?qū)ο蠡A(chǔ)可參看本書的附錄一。設(shè)計(jì)模式是否有必要全部學(xué)一遍?答案是,Yes!別被那些說什么設(shè)計(jì)模式大多用不上,根本不用全學(xué)的輿論所左右。盡管現(xiàn)在設(shè)計(jì)模式遠(yuǎn)遠(yuǎn)不止23種,對所有都有研究是不太容易的,但就像作者本人一樣,在學(xué)習(xí)GoF總結(jié)的23個設(shè)計(jì)模式過程中,你會被那些編程大師們進(jìn)行偉大的技術(shù)思想洗禮,不斷增加自己對面向?qū)ο蟮纳钊肜斫?,從而更好的把這種思想發(fā)揚(yáng)光大。這就如同高中時學(xué)立體幾何感覺沒用,但當(dāng)你裝修好房子購買家俱時才知道,有空間感,懂得空間計(jì)算是如何的重要,你完全可能遇到買了一個大號的冰箱卻放不進(jìn)廚房,或買了開關(guān)門的衣櫥(移門不占空間)卻因床在旁邊堵住了門而打不開的尷尬。重要的不是你將來會不會用到這些模式,而是通過這些模式讓你找到“封裝變化”、“對象間松散耦合”、“針對接口編程”的感覺,從而設(shè)計(jì)出易維護(hù)、易擴(kuò)展、易復(fù)用、靈活性好的程序。成為詩人后可能不需要刻意地按照某種模式去創(chuàng)作,但成為詩人前他們一定是認(rèn)真地研究過成百上千的唐詩宋詞、古今名句。如果說,數(shù)學(xué)是思維的體操,那設(shè)計(jì)模式,就是面向?qū)ο缶幊趟季S的體操。我學(xué)了設(shè)計(jì)模式后時常會過度設(shè)計(jì),如何辦?作者建議,暫時現(xiàn)象,繼續(xù)努力。設(shè)計(jì)模式有四境界:1.沒學(xué)前是一點(diǎn)不懂,根本想不到用設(shè)計(jì)模式,設(shè)計(jì)的代碼很糟糕;2.學(xué)了幾個模式后,很開心,于是到處想著要用自己學(xué)過的模式,于是時常造成誤用模式而不 自知;3.學(xué)完全部模式時,感覺諸多模式極其相似,無法分清模式之間的差異,有困惑,但深知誤用之害,應(yīng)用之時有所猶豫;4.靈活應(yīng)用模式,甚至不應(yīng)用具體的某種模式也能設(shè)計(jì)出非常優(yōu)秀的代碼,以達(dá)到無劍勝有劍的境界。從作者本人的觀點(diǎn)來說,不會用設(shè)計(jì)模式的人要遠(yuǎn)遠(yuǎn)超過過度使用設(shè)計(jì)模式的人,從這個角度講,因?yàn)榕逻^度設(shè)計(jì)而不用設(shè)計(jì)模式顯然是因噎廢食。當(dāng)你認(rèn)識到自己有過度使用模式的時候,那就證明你已意識到問題的存在,只有通過不斷的鉆研和努力,你才能突破“不識廬山真面目,只緣身在此山中”的瓶頸,達(dá)到“會當(dāng)凌絕頂,一覽眾山小”的境界。編程語言的差異本書講的是面向?qū)ο笤O(shè)計(jì)模式,是用.NET中的C#語言編寫,但本書并不是主要講解C#語言或.NET框架的圖書,因此本書同樣適合Java、VB.NET、C++等其他一些面向?qū)ο笳Z言的讀者閱讀來學(xué)習(xí)設(shè)計(jì)模式。就Java而言,主要差異來自C#對于子類繼承父類或?qū)崿F(xiàn)接口用的都是“:”,而Java中兩者是有區(qū)別的。當(dāng)Cat繼承抽象類Animal時,Java語法是public class Cat extends Animal當(dāng)Superman實(shí)現(xiàn)接口IFly時,Java語法是public class Superman implements IFly然后Java中所有的方法都是虛擬的,因此不用指定new或是override修飾符。還有一些其他差異,但基本都不影響本書的閱讀。對于VB.NET的程序員,如果閱讀困難,不妨去網(wǎng)上查找關(guān)于轉(zhuǎn)換C#與VB.Net語言的工具,比如http://www.kamalpatel.net/ConvertCSharp2VB.aspx,將下載本書的源代碼轉(zhuǎn)換后再進(jìn)行閱讀。C++的程序員,可能在語言上會有些差異,不過本書應(yīng)該不會因?yàn)檎Z言造成對面向?qū)ο笏枷氲恼`讀。不是一個人在戰(zhàn)斗首先要感謝我的妻子李秀芳對我寫作本書期間的全力支持,沒有她的理解和鼓勵,就不可能有本書的出版。而我們的寶寶也將在2008年初出生,希望等寶寶懂事后能知道,在寶寶的母親懷胎過程中,寶寶的父親也在為書的誕生而努力。也希望本書成為贈送給他或者她的最好的禮物。父母的養(yǎng)育才有作者本人的今天,本書的出版,尋根溯源,也是父母用心教育的結(jié)果。養(yǎng)育之恩,沒齒難忘。本書起源于本人在“博客園”網(wǎng)站的博客http://cj723.cnblogs.com/中的一個連載文章《小菜編程成長記》。沒想到連載引起了不小的反應(yīng),網(wǎng)友們普遍認(rèn)為本人的這種技術(shù)寫作方式新穎、有趣、喜歡看。正是因?yàn)楸姸嗑W(wǎng)友的支持,本人有了要把GoF的23種設(shè)計(jì)模式全部成文的沖動。非常感謝這些在博客回復(fù)中鼓勵我的朋友。這里需要特別提及洪立人先生,他是本人在寫書期間共同為理想奮斗的戰(zhàn)友,寫作也得到了他的大力支持和幫助,我寫作的不少妙句也來自我們倆共同合作的網(wǎng)站http://www.miaoju.net。在此對兩位表示衷心的感謝。寫作過程中,本人參考了許多國內(nèi)外大師的設(shè)計(jì)模式的著作。尤其是《設(shè)計(jì)模式》(作者:簡稱GoF的Erich Gamm,Richard Helm,Ralph Johnson,John Vlissides)、《設(shè)計(jì)模式解析》(作者:Alan Shalloway,James R. Trott)、《敏捷軟件開發(fā):原則、模式與實(shí)踐》(作者:Robert C.Martin)、《重構(gòu)——改善既有代碼的設(shè)計(jì)》(作者:Martin Fowler)、《重構(gòu)與模式》(作者:Joshua Kerievsky)、《Java與模式》(作者:閻宏等等,沒有他們的貢獻(xiàn),就沒有本書的出版。也希望本書能成為更好閱讀他們這些大師作品的前期讀物。寫作過程中,本人還參考了http://www.dofactory.com/ 關(guān)于23個設(shè)計(jì)模式的講解,并引用了他們的結(jié)構(gòu)圖和基本代碼。在博客園中的許多朋友,比如張逸、呂震宇、李會軍、idior、Allen Lee的博文,MSDN SmartCast中李建忠的講座,CSDN博客中的大衛(wèi)、ai92的博文,網(wǎng)站J道www.jdon.com 的版主banq的文章都給本人的寫作提供了非常大的指引和幫助,在此表示感謝。另外博客園的雙魚座先生還對本人的部分代碼提出了整改意見,也表示衷心的謝意。詳細(xì)參考資料與網(wǎng)站鏈接,見附錄二。事實(shí)上,由于本人長期有看書記讀書筆記的習(xí)慣,所以書中引用筆記的內(nèi)容,也極有可能是來自某本書或者某個朋友的博客、某個網(wǎng)站的文章。而本人已經(jīng)無法一一說出其引用的地址,但這些作者的智慧同樣對本書的寫作帶來了幫助,在此只能說聲謝謝。最后,對本書的責(zé)任編輯陳冰先生及清華大學(xué)出版社的相關(guān)工作人員,表示由衷的感謝。本書的出版離不開陳先生的指導(dǎo)和其他工作人員的辛勤工作。程 杰 2007年7月序這本書最初起源于作者程杰在其博客中所寫的連載文章——《小菜編程成長記》。隨著文章的一篇篇發(fā)布,這些文章新穎的表現(xiàn)形式和獨(dú)特的風(fēng)格受到了眾多讀者的關(guān)注和喜愛,很多人在博客中留下了評語。有些雖然只有短短的一句話,但也可以看出是對作者由衷的感謝。作為本書的策劃編輯,最初我也是在博客園中瀏覽博文時閱讀到這些文章的,我的直覺和網(wǎng)友們熱情洋溢的評語告訴我,這些文章有作為一部書出版的價值,于是我就聯(lián)系了程杰。幾個月后,我拿到了這部書的初稿。初審后,我發(fā)現(xiàn)書稿中存在一些問題。比如,當(dāng)時書稿中還沒有對UML類圖進(jìn)行講解的內(nèi)容,這會導(dǎo)致初學(xué)者學(xué)習(xí)后面的內(nèi)容時感到理解困難,于是我請作者在第1章中增加了UML類圖這一節(jié),這是簡潔卻精彩的一節(jié);另外,當(dāng)時作者為了便于表達(dá)某些舉例的含義,有相當(dāng)數(shù)量的代碼都是用中文編寫的,雖然中文代碼看似易懂,但卻會令絕大多數(shù)早已熟悉了英文代碼的程序員們感到困惑和難以閱讀,所以我請作者把代碼改回為程序員們所熟悉的英文代碼,并同時添加了更詳細(xì)的中文注釋。經(jīng)過幾番認(rèn)真和辛苦的修改與調(diào)整,現(xiàn)在,這本書在你的手中了。對于這本書,我想說的是,其中的很多篇章非常的精彩,會令你禁不住叫好,但也有一些篇章會顯得有些拖沓,或者是有些牽強(qiáng),然而,隨著你讀過那些精彩的段落,讀過那些不那么精彩的段落,最終,你會讀到書的最后一頁(很多書不能使你做到這一點(diǎn)),當(dāng)你讀完全書時,你會發(fā)現(xiàn),你的心情很愉快,很平靜,即使是那些當(dāng)時看起來不那么精彩的段落,現(xiàn)在也都成為了這溫馨故事的一部分。你會記得書中那個好學(xué)、天真、而又執(zhí)著的小菜,也會記得那個善于啟發(fā),經(jīng)驗(yàn)老道的大鳥。下面這些是來自作者博客的網(wǎng)友評論,看完這些熱情洋溢的評論,就和作者一起,進(jìn)入設(shè)計(jì)模式的大話境界吧。本書策劃編輯 陳冰2007年10月18日網(wǎng)友評論daigua:看到這篇精彩的成長記,我連飯都不想吃了,什么事都不想做,就想把它看完。寫得太好了!是啊,現(xiàn)在很多教材都太枯燥了,不好理解。其實(shí)書的意義就在于讓人學(xué)到知識,而不在于用什么方式,為什么一定要那么教條呢,只要能讓人比較容易地學(xué)到書里的知識就是一本好書。謝謝你啊,給了我很大的信心。我現(xiàn)在很有信心把編程進(jìn)行到底,哈哈。光頭小松鼠:絕對經(jīng)典!一篇小故事,把程序的靈活性、可擴(kuò)展性、可維護(hù)、可復(fù)用等說得怎一個妙字了得!沉默天蝎:感激,讓我這個菜鳥頓悟。這樣的寫法太好了,如果老大你出書,我肯定購買!碳碳:這種學(xué)習(xí)的方式真的很神奇,盡管每個人都能想到,但不是每個人都能做到?;蛟S可以把系列文章歸檔出書,說不定會收到追捧,呵呵。Bryant:真的是太棒了!我原來看過一些有關(guān)設(shè)計(jì)模式的書,都覺得太抽象,根本就不能理解,也不知道啥時候能用上。看過你寫的這些文章,才知道了應(yīng)該怎樣在實(shí)際中運(yùn)用這些模式,而且文筆非常的幽默,享受!Thx ^_^ 支持!有個建議,最好慢慢地把所有的設(shè)計(jì)模式都聊聊!Bryant:不錯,樓主說的非常幽默,通俗,把我們一步一步帶入面向?qū)ο蟮氖澜?thx ^_^Bryant:太棒了,我正是這樣初學(xué)設(shè)計(jì)模式的小菜,需要這樣的文章,謝謝樓主!菜鳥飛:樓主,加油,支持你。在這里獻(xiàn)上崇高的敬意,不管你有沒有感受到我摯熱的目光。請你相信,有這樣一些人一直在默默地關(guān)注著你,期待著你。wdx2008:非常好?。?!幽默,搞笑,易懂,真神人也,鬼神不可測!支持樓主!!空明流轉(zhuǎn):呵呵,樓主說得蠻好。國外的文章好就好在有例子,“廢話”多,所以比較好理解。至于行文風(fēng)格嘛,這個倒是因人而異的。我個人就偏向于論文式的行文風(fēng)格,邏輯嚴(yán)密,層層遞進(jìn),闡述也很清晰。就有點(diǎn)像有序數(shù)組,二分法就能輕松查找到自己想要的東西,但國內(nèi)的那種論文式的文章,呵呵,我看是賣弄的成分居多,實(shí)作的成分偏少,所以才那么難讀的吧。Char:現(xiàn)在的大學(xué)就缺少這種既通俗易懂,又有內(nèi)容的東西。Apple:不錯,學(xué)習(xí)了。希望博主能再接再厲多寫點(diǎn),看了很多書都沒有看你的文章明白得快。SnowDoggie:呵呵,挺好的。其實(shí)要想找個絕對沒有漏洞的例子是很辛苦的,關(guān)鍵在于文章本身能說明問題,能體現(xiàn)作者的意圖就足夠了。昨天和朋友一起爬山的時候還討論了你的文章風(fēng)格,其實(shí)最有用的還是你這種寓教于樂,步步深入的風(fēng)格,陽春白雪的經(jīng)典雖然是經(jīng)典,大眾卻不見得喜歡。Jerry:不錯的文章,簡單明了,又不乏趣味,好的文章就得頂下。izhizhe2000:很好,整個系列寫完之后可以出書了,保證受大學(xué)生的廣泛歡迎!mekong:很是欣賞這樣幽默風(fēng)趣又不失睿智深刻的文字。Wuyisky:呵呵,樓主不僅程序?qū)懙煤?,而且還有文學(xué)天賦。佩服!Jack:真正的高手是用最生動的語言,最簡單的例子,這才是真正的“深入淺出”。贊?。。±闲?,加油,繼續(xù)喲。BoyLee:人才,愛死你了。做了一年外包,沒技術(shù)含量。正打算從頭學(xué)習(xí)這些東西,這樣的方式我最喜歡了。Leoxu:很不錯,對正在找工作的我有很大的幫助。以后會多來光顧。Ame:寫得承上啟下,始終有一主干線貫穿,作者的文字功底很強(qiáng)啊!Artech:我很喜歡你的寫作風(fēng)格!以一種調(diào)侃的方式講明一個深奧的問題。我一直在嘗試如何以一種讓每個人都懂得的語言來向大家分享我所理解的.NET。你給了我一個啟發(fā)。8:醍醐灌頂!感謝,領(lǐng)悟了不少東西?。?!Yufengly:真是太容易理解了,而且看后印象深刻,繼續(xù)努力!期待下文……支持作者!Sopper:支持,例子舉得很形象,寫得很棒,以后會常來關(guān)注。d:會技術(shù)的高人有很多,但能把技術(shù)講得如此通俗易懂的高人并不多,你是一個,謝謝~~~white.wu:非常喜歡您這種授人以“漁”的文章。Answer:強(qiáng)啊,本菜鳥受益很大,謝謝。Hanlei:強(qiáng),很受益啊,感謝樓主,寫出這么好的文章來。金色海洋(jyk):繼續(xù)呀,我們期待中……,寫得很好,一看就懂。DSharp:看博客園這么久了,終于看到一篇有中國特色的好文。
編輯推薦
《大話設(shè)計(jì)模式》是準(zhǔn)備攀登面向?qū)ο缶幊谈叻迮笥褌兊囊啡撕吞釘y者;《大話設(shè)計(jì)模式》是學(xué)習(xí)、體會和領(lǐng)悟了眾多大師智慧結(jié)晶后的圖書作品;《大話設(shè)計(jì)模式》是你深入理解和感受GoF的《設(shè)計(jì)模式》及其它大師作品的必備書籍;《大話設(shè)計(jì)模式》授之以“魚”,更授之以“漁”。感受設(shè)計(jì)演變過程中所蘊(yùn)含的大智慧,體會樂與怒的程序人生中值得回味的一幕幕。設(shè)計(jì)模式的趣味解讀,面向?qū)ο蟮纳钊肫饰觥T谠溨C與溫馨中做一次面向?qū)ο缶幊趟季S的體操。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載