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