關(guān)于我們
書單推薦
新書推薦
|
大話設(shè)計模式
本書共分為一個楔子+29章正文。其中, 楔子主要通過一個編程實例的演變?yōu)槌鯇W(xué)者介紹了面向?qū)ο蟮幕靖拍? 用來奠定面向?qū)ο蠡A(chǔ)以及樹立正確的、有高度的開發(fā)思維; 第0、1、3、4、5章著重講解了面向?qū)ο蟮囊饬x、好處以及幾個重要的設(shè)計規(guī)則; 第2章, 以及第6-28章詳細(xì)講解了23種設(shè)計模式; 第29章對設(shè)計模式進行了全面總結(jié)。
《大話設(shè)計模式【Java溢彩加強版】》延續(xù)了前作輕松調(diào)侃的風(fēng)格,采用了師生對話的方式展開討論,其中穿插了大量“接地氣”的類比案例,幫助大家迅速“開竅”,作者精心將本書圖表制作成彩色三維形式,閱讀起來你會發(fā)現(xiàn),不僅僅是養(yǎng)眼,對一些流程、概念的解說,用彩色三維圖表更為精準(zhǔn),學(xué)習(xí)體驗有了質(zhì)變。
大話設(shè)計模式 | 【Java溢彩加強版】
本書起因
寫這本書源于我的一次做培訓(xùn)的經(jīng)歷,培訓(xùn)對象大多是計算機專業(yè)的學(xué)生或有一定 經(jīng)驗的在職開發(fā)者。他們都知道類、方法、構(gòu)造方法,甚至抽象類、接口等概念,并用 Visual Studio寫過桌面或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),小說之所以可以堅持 讀完是因為我對它感興趣,作者的精妙文筆布局在吸引我。而有些技術(shù)書的枯燥乏味使 得讀者閱讀很難堅持,很多時候讀幾章就將其放入書架了。
技術(shù)的教學(xué)同樣如此,除非學(xué)生是抱著明確的學(xué)習(xí)動機來參與其中,否則照本宣科 的教學(xué)、枯燥乏味的講解,學(xué)生一定會被龐雜的概念和復(fù)雜的邏輯攪暈了頭腦,致使效 果大打折扣。也正因如此,造成部分學(xué)生學(xué)了四年的計算機編程,卻可能連面向?qū)ο笥? 什么好處都還說不清。
為什么不可以讓技術(shù)書帶點趣味性呢?哪怕這些趣味性與所講的技術(shù)并不十分貼 切,只要不是影響技術(shù)核心的本質(zhì),不產(chǎn)生重大的錯誤,讓讀者能輕松閱讀它,并且有 了一定的了解和感悟,這要比一本寫得高深無比卻被長期束之高閣的書好得多。
也正是這個原因,本人開始了關(guān)于設(shè)計模式的趣味性寫作的嘗試。
本書讀者
顯然,本書不是給零編程經(jīng)驗的人看的,對于想入這一行的朋友來說,找一門編程 語言,從頭開始或許才是正道。而本書也不太適合有多年面向?qū)ο箝_發(fā)經(jīng)驗、對常用設(shè) 計模式了如指掌的人—畢竟這里更多的是講解基本觀念。
前 言
III
前 言
我時常拿程序員的成長與足球運動員的成長作對比。
GoF的《設(shè)計模式》好比是世界頂級足球射門集錦,而《重構(gòu)》《敏捷軟件開發(fā)》 《設(shè)計模式解析》好比是一場場精彩的足球比賽。雖然我為之瘋狂,為之著迷,可是我 并不只是想做一個球迷(軟件使用者),而是更希望自己能成為一個球員(軟件設(shè)計 師),能夠親自上場比賽,并且最終成為球星(軟件架構(gòu)師)。我仔細(xì)地閱讀這些被譽 為經(jīng)典的著作,認(rèn)真實踐其中的代碼,但是我總是半途而廢、堅持不下去,我痛恨自己 意志力的薄弱、憎惡自己輕易地放棄,難道我真的就是那么笨?
痛定思痛,我終于發(fā)現(xiàn),貝利、馬拉多納不管老、胖都是用來敬仰的,貝克漢姆、 羅納爾迪尼奧不管美、丑都是用來欣賞的,但他們的球技……客氣地說,是不容易學(xué)會 的,客觀地說,是不可能學(xué)得會的。為什么會這樣?原來,我學(xué)習(xí)中缺了一個很重要的 環(huán)節(jié),我們在看到了精彩的球賽、欣賞球星高超球技的同時,卻忽略了球星的成長過 程。他們盡管有一定天分,但也是從最底層通過努力一點一點慢慢地顯露出來的,我們 需要的不僅是世界杯上的那定乾坤的一腳,更需要了解這一腳之前是如何練出那種神奇 腳法的方法。對于程序員來講,精彩代碼的實現(xiàn)思路,要比看到精彩的代碼更加令人 期待。
本書顯然不是培養(yǎng)球星(軟件架構(gòu)師)的豪門俱樂部,而是訓(xùn)練足球基本功的體 校,培訓(xùn)的是初學(xué)足球的小球員(面向?qū)ο蟮某绦騿T),本書希望的是讀者閱讀后可以 打好面向?qū)ο缶幊痰幕A(chǔ),從而更加容易并深入地理解和感受GoF的《設(shè)計模式》以及其 他大師作品的魅力。
本書定位
本書是在學(xué)習(xí)眾多大師智慧結(jié)晶的圖書作品、分享了多位朋友的實踐經(jīng)驗的基礎(chǔ) 上,加之自己的編程感受寫出來的。正如牛頓有句名言:“如果說我比別人看得更遠(yuǎn) 些,那是因為我站在了巨人的肩上!
顯然本書并沒有創(chuàng)造或發(fā)現(xiàn)什么模式,因此談不上站在巨人肩膀上而看得更遠(yuǎn)。 所以作者更希望本書能成為一些準(zhǔn)備攀登面向?qū)ο缶幊谈叻宓呐笥训牡巧揭啡、提攜 者,在您登山途中迷路時給予指引一條可以堅實踩踏的路線,在您峭壁攀巖不慎跌落時 給予保護和鼓勵。
本書特色
本書有兩個特色。
第一個特色是重視過程。我看了太多的計算機編程類的圖書,大多數(shù)書籍都是在 集中講授優(yōu)秀的解決方案或者完美的程序樣例,但對這些解決方案和程序的演變過程卻 重視不夠,好書之所以好,就是因為作者可以站在學(xué)習(xí)者的角度去講解問題所在,讓學(xué)
大話設(shè)計模式 | 【Java溢彩加強版】
習(xí)門檻降低!吨貥(gòu)與模式》中有一句經(jīng)典之語:“如果想成為一名更優(yōu)秀的軟件設(shè)計 師,了解優(yōu)秀軟件設(shè)計的演變過程比學(xué)習(xí)優(yōu)秀設(shè)計本身更有價值,因為設(shè)計的演變過程 中蘊藏著大智慧!北救司拖M芡ㄟ^小菜與大鳥的對話,在不斷地提問與回答過程 中,在程序的不斷重構(gòu)演變中,把設(shè)計模式的學(xué)習(xí)門檻降低,讓初學(xué)者可以更加容易地 理解,為什么這樣設(shè)計才好,你是如何想到這樣設(shè)計的。
第二個特色就是貼近生活。盡管編程是嚴(yán)謹(jǐn)?shù),不容大話和戲說,但生活卻是多姿 多彩的,而設(shè)計模式也不是完全孤立于現(xiàn)實世界而憑空想出來的理論。事實上,所有的 模式都可以在生活中找到對應(yīng)。因此,通過主人公小菜和大鳥的對話,將求職、面試、 工作、交友、投資、兼職、辦公室文化、生活百味等非常接近程序員生活原貌的場景寫 到了書中,用一個個小故事來引出模式,會讓讀者相對輕松地進入學(xué)習(xí)設(shè)計模式的狀 態(tài)。當(dāng)然,此舉的最大目的還是為了深入淺出,而非純粹噱頭。
本書內(nèi)容
本書通篇都是以情景對話的形式,用一個又一個的小故事或編程示例來組織的。全 書共分為四個部分。
●開篇是楔子,主要向不熟悉面向?qū)ο缶幊痰淖x者給出一個觀念說明,并通過一 個例子的演變介紹類、封裝、繼承、多態(tài)、接口等概念。 ●第二部分(第4~5章,第11章)是面向?qū)ο蟮囊饬x和好處以及幾個重要的設(shè)計原 則—通過小菜面試的失敗引出。 ●第三部分(第1~3章、第6~10章、第12~28章)是詳細(xì)講解23個設(shè)計模式。 ●第四部分(第29章)是對設(shè)計模式的總結(jié),利用小菜夢到的超級模式大賽的場 景,把所有的面向?qū)ο蠛湍J礁拍疃紨M人化來趣味性地總結(jié)設(shè)計模式之間的異 同和關(guān)鍵點。
本書人物及背景
小菜:原名蔡遙,22歲,上海人,上海某大學(xué)計算機專業(yè)四年級學(xué)生,成績一般, 考研剛結(jié)束,即將畢業(yè),正求職找工作,夢想進大廠。
大鳥:原名李大遼,29歲,小菜的表哥,云南昆明人,畢業(yè)后長期從事軟件開發(fā)和 管理工作,近期到上海發(fā)展,借住小菜家在寶山的空房內(nèi)。
小菜以向大鳥學(xué)習(xí)為由,也從市區(qū)父母家搬到寶山與大鳥同住。
本書研讀方法
本書建議按順序閱讀,如果您感覺由于面向?qū)ο笾R的匱乏(例如對繼承、多態(tài)、
前 言
接口、抽象類的理解不足)造成閱讀上的困難,不妨先閱讀楔子的“培訓(xùn)實習(xí)生—面 向?qū)ο蠡A(chǔ)”部分,然后再從第1章開始閱讀。如果您已經(jīng)對不少設(shè)計模式很熟悉,也不 妨挑選不熟悉的模式章節(jié)閱讀。
本書中的很多精華都來自許多大師作品,建議讀者通過筆記形式記錄,這將有助于 您的記憶和理解設(shè)計模式,增強最終的讀書效果。
本書中出現(xiàn)的“[ ]”表示句子摘自某書。例如,“策略模式(Strategy):它定義了 算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響使 用算法的客戶[DP]。”其中“[DP]”表示此句摘自《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕? 礎(chǔ)》,詳細(xì)摘要說明請參看參考文獻(xiàn)。
本書第29章中的虛擬人物姓名都是軟件編程中的專業(yè)術(shù)語,因此凡是專業(yè)術(shù)語被影 射人物姓名的都用紫色字表示,以和實際術(shù)語區(qū)分。例如,“第一位是我們OOTV創(chuàng)始 人,面向?qū)ο笙壬,這里的紫色字面向?qū)ο笾溉嗣?
關(guān)于本書學(xué)習(xí)的疑問解答
●看本書需要什么基礎(chǔ)?
主要是Java或其他編程語言的基礎(chǔ)知識,如變量、分支判斷、循環(huán)、函數(shù)等編程基 礎(chǔ),關(guān)于面向?qū)ο蠡A(chǔ)可參看本書的楔子(第0章)。
●設(shè)計模式是否有必要全部學(xué)一遍?
答案是,Yes!別被那些說什么設(shè)計模式大多用不上,根本不用全學(xué)的輿論所左右。 盡管現(xiàn)在的設(shè)計模式遠(yuǎn)遠(yuǎn)不止23種,但對所有的都有研究是不太容易的,就像作者本人 一樣,在學(xué)習(xí)GoF總結(jié)的23個設(shè)計模式過程中,你會被那些編程大師們進行偉大的技術(shù)思 想洗禮,不斷增加自己對面向?qū)ο蟮纳钊肜斫,從而更好地把這種思想發(fā)揚光大。這就 如同高中時學(xué)立體幾何感覺沒用,但當(dāng)你裝修好房子購買家具時才知道,有空間感,懂 得空間計算是如何重要,你完全可能遇到買了一個大號的冰箱卻放不進廚房,或買了開 關(guān)門的衣櫥(移門不占空間)卻因床在旁邊堵住了門而打不開的尷尬。
重要的不是你將來會不會用到這些模式,而是通過這些模式讓你找到“封裝變 化”“對象間松散耦合”“針對接口編程”的感覺,從而設(shè)計出易維護、易擴展、易復(fù) 用、靈活性好的程序。成為詩人后可能不需要刻意地按照某種模式去創(chuàng)作,但成為詩人 前他們一定是認(rèn)真地研究過成百上千的唐詩宋詞、古今名句。
如果說,數(shù)學(xué)是思維的體操,那設(shè)計模式,就是面向?qū)ο缶幊趟季S的體操。
●我學(xué)了設(shè)計模式后時常會過度設(shè)計,如何辦?
作者建議,暫時現(xiàn)象,繼續(xù)努力。
設(shè)計模式有四境界:
..沒學(xué)前一點不懂,根本想不到用設(shè)計模式,設(shè)計的代碼很糟糕。 ..學(xué)了幾個模式后,很開心,于是到處想著要用自己學(xué)過的模式,于是時常造成
大話設(shè)計模式 | 【Java溢彩加強版】
誤用模式而不自知。 ..學(xué)完全部模式時,感覺諸多模式極其相似,無法分清模式之間的差異,有困 惑,但深知誤用之害,應(yīng)用之時有所猶豫。 ..靈活應(yīng)用模式,甚至不應(yīng)用具體的某種模式也能設(shè)計出非常優(yōu)秀的代碼,以達(dá) 到無劍勝有劍的境界。
從作者本人的觀點來說,不會用設(shè)計模式的人要遠(yuǎn)遠(yuǎn)超過過度使用設(shè)計模式的人, 從這個角度講,因為怕過度設(shè)計而不用設(shè)計模式顯然是因噎廢食。當(dāng)你認(rèn)識到自己有過 度使用模式的時候,那就證明你已意識到問題的存在,只有通過不斷的鉆研和努力,你 才能突破“不識廬山真面目,只緣身在此山中”的瓶頸,達(dá)到“會當(dāng)凌絕頂,一覽眾山 小”的境界。
編程語言的差異
本書講的是面向?qū)ο笤O(shè)計模式,是用Java語言編寫,但本書并不是主要講解Java語言 的圖書,因此本書同樣適合C#、VB.NET、C++等其他一些面向?qū)ο笳Z言的讀者閱讀來學(xué) 習(xí)設(shè)計模式。
就C#而言,主要差異來自C#對于子類繼承父類或?qū)崿F(xiàn)接口用的都是“:”,而Java 中兩者是有區(qū)別的。
當(dāng)Cat繼承抽象類Animal時,C#語法是:
public class Cat : Animal
當(dāng)Superman實現(xiàn)接口IFly時,C#語法是:
public class Superman : IFly
然后C#類中的方法,如果父類是虛方法,需要子類指定new或是override修飾符。還 有一些其他差異,但基本都不影響本書的閱讀。
C++的程序員,可能在語言上會有些差異,不過本書應(yīng)該不會因為語言造成對面向 對象思想的誤讀。
本書代碼下載
前 言
盡管本書中的代碼都提供下載,但不經(jīng)過讀者的自己手動輸入過程,其實閱讀的 效果是大打折扣的。強烈建議讀者根據(jù)樣例自己寫程序,只有在運行出錯,達(dá)不到預(yù)期 效果時再查看本書提供的源程序,這樣或許才是最好的學(xué)習(xí)方法。有問題可及時與我聯(lián) 系。博客是http://cj723.cnblogs.com/。
本書課件下載
讀者群
讀者在學(xué)習(xí)過程中遇到的問題,可以加入本書QQ群討論。另外,本書雖然經(jīng)歷了十 幾年的迭代錘煉,依然可能存在錯誤。讀者群會隨時更新勘誤文檔。
QQ群:638992788
不是一個人在戰(zhàn)斗
首先要感謝我的妻子李秀芳對我寫作本書期間的全力支持,沒有她的理解和鼓勵, 就不可能有本書的出版。
父母的養(yǎng)育才有作者本人的今天,本書的出版,尋根溯源,也是父母用心教育的結(jié) 果。養(yǎng)育之恩,沒齒難忘。
本書起源于本人在“博客園”網(wǎng)站的博客http://cj723.cnblogs.com/中的一個連載文章 《小菜編程成長記》。沒想到連載引起了不小的反響,網(wǎng)友普遍認(rèn)為本人的這種技術(shù)寫 作方式新穎、有趣、喜歡看。正是因為眾多網(wǎng)友的支持,本人有了要把GoF的23種設(shè)計模 式全部故事化的沖動。非常感謝這些在博客回復(fù)中鼓勵我的朋友。
這里需要特別提及洪立人先生,他是本人在寫書期間共同為理想奮斗的戰(zhàn)友,寫作 也得到了他的大力支持和幫助。在此對他表示衷心的感謝。
寫作過程中,本人參考了許多國內(nèi)外大師的設(shè)計模式的著作。尤其是《設(shè)計模式》 (作者:簡稱GoF的Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides)、《設(shè) 計模式解析》(作者:Alan Shalloway,James R. Trott)、《敏捷軟件開發(fā):原則、模式
大話設(shè)計模式 | 【Java溢彩加強版】
與實踐》(作者:Robert C.Martin)、《重構(gòu)—改善既有代碼的設(shè)計》(作者:Martin Fowler)、《重構(gòu)與模式》(作者:Joshua Kerievsky)、《Java與模式》(作者:閻 宏),等等,沒有他們的貢獻(xiàn),就沒有本書的出版。也希望本書能成為更好閱讀他們這 些大師作品的前期讀物。
寫作過程中,本人還參考了http://www.dofactory.com/關(guān)于23個設(shè)計模式的講解,并 引用了他們的結(jié)構(gòu)圖和基本代碼。在博客園中的許多朋友,如張逸、呂震宇、李會軍、 idior、Allen Lee的博文,MSDN SmartCast中李建忠的講座,CSDN博客中的大衛(wèi)、ai92的 博文,網(wǎng)站J道www.jdon.com的版主banq的文章都給本人的寫作提供了非常大的指引和幫 助,在此表示感謝。另外,博客園的雙魚座先生還對本人的部分代碼提出了整改意見, 也表示衷心的謝意。詳細(xì)參考資料與網(wǎng)站鏈接見參考文獻(xiàn)。
事實上,由于本人長期有看書記讀書筆記的習(xí)慣,所以書中引用筆記的內(nèi)容,也極 有可能是來自某本書或者某個朋友的博客、某個網(wǎng)站的文章。而本人已經(jīng)無法一一說出 其引用的地址,但這些作者的智慧同樣對本書的寫作帶來了幫助,在此只能說聲謝謝。
最后,對清華大學(xué)出版社表示由衷的感謝。
程 杰
2022年9月 程杰,一個被讀者譽為很適合寫IT技術(shù)書的家伙。 著有 《大話數(shù)據(jù)結(jié)構(gòu)》(霸榜12年,知乎推薦、B站解書常客。開創(chuàng)了一種適合中國人閱讀的趣味講解IT知識的風(fēng)格與模式)。 作者參與過政府機構(gòu)、證券、游戲、交通等多種行業(yè)的軟件開發(fā)及項目管理工作,也曾做過軟件培訓(xùn)的教師,目前從事教育類APP/微信小程序的開發(fā)與運營。因為有過兩年半高中數(shù)學(xué)教學(xué)的獨特經(jīng)歷,使得其書作當(dāng)中處處以初學(xué)者視角考慮和分析問題,成為了當(dāng)前很受歡迎的IT技術(shù)圖書作者之一。
你還可能感興趣
我要評論
|