物件導(dǎo)向設(shè)計(jì)模式

出版時(shí)間:2001  出版社:培生  作者:Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides  譯者:葉秉哲  
Tag標(biāo)簽:無  

圖書封面

圖書標(biāo)簽Tags

評(píng)論、評(píng)分、閱讀與下載


    物件導(dǎo)向設(shè)計(jì)模式 PDF格式下載


用戶評(píng)論 (總計(jì)7條)

 
 

  •     沒看過的一定要看,不管你用什么語言。
      
      已看過的一定要再看,不管是什么時(shí)候。
      
      經(jīng)典的經(jīng)典。
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
  •     這應(yīng)該算是學(xué)術(shù)著作——從最后一章寫道的編著歷史看,也確實(shí)如此(最先起源于Erich的博士論文)??峙麓蟛糠肿x者都會(huì)對(duì)這樣的書籍感到枯燥。不過倒挺適合我的口味:-D。由于寫作年代久遠(yuǎn)等緣故,書中的23種設(shè)計(jì)模式都是“古典”設(shè)計(jì)模式了。從現(xiàn)在的角度看,這些都只是設(shè)計(jì)模式中的冰山一角。書中所舉的應(yīng)用例子也都是很傳統(tǒng)的軟件應(yīng)用。不過讀下來,感覺多態(tài)、復(fù)用的思想貫穿全書,基本上每種設(shè)計(jì)模式都對(duì)應(yīng)著一種要復(fù)用的東西(可能需要第二次閱讀以確認(rèn)),這也符合本書的副標(biāo)題。這個(gè)思想應(yīng)該對(duì)當(dāng)今大多數(shù)設(shè)計(jì)模式仍然適用。
  •     適合反復(fù)閱讀。下面的話都出現(xiàn)在這本書中,第一次看時(shí)對(duì)這些都無感,甚至沒有印象。再看時(shí),一眼就發(fā)現(xiàn)了這些話
      
      繼承與模板注重代碼復(fù)用
      接口則強(qiáng)調(diào)一個(gè)對(duì)象是否可以被另一個(gè)對(duì)象替代
      
      面向接口編程
      盡量使用對(duì)象組合而不是繼承
      。。。。。。
      
      
  •     這本書的確很好,但是完全搞明白其中的模式并不是很容易。很重要的一點(diǎn):設(shè)計(jì)模式只是一個(gè)思路,一個(gè)方法,最重要的是實(shí)現(xiàn)代碼復(fù)用、代碼的可維護(hù)性、可讀性。抱歉,你的評(píng)論太短了抱歉,你的評(píng)論太短了抱歉,你的評(píng)論太短了抱歉,你的評(píng)論太短了抱歉,你的評(píng)論太短了
  •     以前曾看過此書的一部分,感覺就是看不明白或者以為自己看明白了卻不知道怎么用。工作半年后,偶然間拿起這本書再看,覺得他說的就是我想要的,軟件模塊如何復(fù)用,類之間怎樣組合才有靈活性,不同的目的選用不同的設(shè)計(jì)模式,設(shè)計(jì)模式的適用場(chǎng)景,如何協(xié)作。這些收獲當(dāng)然與一段時(shí)間的工作經(jīng)驗(yàn)和對(duì)工作的思考分不開,我不是那種不做事,想一想就能明白的人。GoF用簡(jiǎn)單的語言解答的很好,本書原版沒有看過,只看了中文的,翻譯水平可以認(rèn)可。此書是看過《程序員修煉之道》之后的必讀之物。
  •     銅彈
      
       二十五年前,弗瑞德.布魯克斯“沒有銀彈”的論文讓古老的迷信成為了現(xiàn)代軟件工程領(lǐng)域家喻戶曉的時(shí)髦比喻。八年之后,《人月神話》二十周年紀(jì)念版發(fā)行,他談了對(duì)面向?qū)ο缶幊痰目捶?。面向?qū)ο笕匀皇菑拇我獜?fù)雜性(外在技術(shù)的復(fù)雜)去解決復(fù)用的問題,還沒有從軟件項(xiàng)目針對(duì)解決的問題本身的主要復(fù)雜性(內(nèi)在業(yè)務(wù)邏輯的復(fù)雜)上去解決問題,當(dāng)然,面向?qū)ο笕匀皇且活w有助于代碼和算法級(jí)別復(fù)用的銅彈。
       人們似乎永遠(yuǎn)找不到銀彈,因?yàn)橹孕枰蛡虺绦騿T,就是我們要解決問題。如果問題的業(yè)務(wù)邏輯本身就是復(fù)雜和全新的,就不太可能存在重用的萬能方法來提高效率。
      
      四人幫
      
       但是我們?nèi)匀豢梢詮南嗨茊栴}的成功解決方案中歸納經(jīng)驗(yàn),設(shè)計(jì)模式的概念就是從實(shí)際設(shè)計(jì)問題的解決中涌現(xiàn)的。綽號(hào)四人幫(gang of four)用來戲稱《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書的四位作者,同時(shí)方便將他們最初的圣經(jīng)和其它的關(guān)于設(shè)計(jì)模式的書區(qū)別開來?!对O(shè)計(jì)模式》一共總結(jié)出了23種成功的設(shè)計(jì)思路,按不同的標(biāo)準(zhǔn)進(jìn)行了分類,以便比較、啟發(fā)我們提出新的模式。設(shè)計(jì)模式的概念標(biāo)志著開始有更多關(guān)注在主要問題的解決上而不僅僅停留在技術(shù)問題上。
       模式依據(jù)目的可分為創(chuàng)建型、結(jié)構(gòu)型和行為型三種。創(chuàng)建型模式與對(duì)象的創(chuàng)建有關(guān),結(jié)構(gòu)型模式處理類和對(duì)象的組合,行為型模式對(duì)類或?qū)ο笤鯓咏换ズ头峙渎氊?zé),通常涉及類方法。我將模式按照相關(guān)的主題進(jìn)行分組,綜合上述兩種分法,可以得到一個(gè)如下的表格:
      
      
       | 創(chuàng)建型 | 結(jié)構(gòu)型 |行為型
      組合 | Abstract Factory |Bridge |Visitor
      
      層次 | | Composite |Interpreter
       | | |Iterator
       | | |Chain of Responsibility
      
      集中 | Singleton | Flyweight | Mediator
       | |Facade | Command
       | | |Observer
      
      解耦 |Factory Method | Decorator | State
       | Prototype |Proxy |Strategy
       | Builder |Adapter |Template Method
      
      序列化 | | | Memento
      
      組合爆炸
      
       在設(shè)計(jì)模式時(shí),第一個(gè)要考慮的問題是類的組合爆炸問題。當(dāng)一個(gè)抽象有多個(gè)具體實(shí)現(xiàn)時(shí),通常用繼承來協(xié)調(diào)。但是,如果問題包含有多個(gè)層次的抽象,機(jī)械的使用單一的繼承策略來對(duì)應(yīng)所有的組合會(huì)產(chǎn)生大量難以維護(hù)的類。為了讓代碼易于修改擴(kuò)充,應(yīng)該將不同的抽象部分分離開來,分別繼承,然后通過對(duì)象間的引用來組合。例如,在抽象工廠模式中,有兩個(gè)方面的抽象問題,一個(gè)是工廠的抽象問題,不同的工廠在不同的情況下會(huì)采用不同的具體標(biāo)準(zhǔn)構(gòu)造產(chǎn)品類,另一方面有產(chǎn)品類的抽象問題,不同的一系列產(chǎn)品需要一個(gè)產(chǎn)品抽象類來統(tǒng)一他們的構(gòu)造、使用接口。整體上,每一個(gè)具體的工廠都會(huì)引用每一個(gè)不同的具體產(chǎn)品對(duì)象。在結(jié)構(gòu)型模式中,橋接模式也通過分離兩個(gè)不同的抽象來實(shí)現(xiàn),兩個(gè)抽象通過基類的公共接口間的橋接整合在一起。行為型模式中的訪問者模式解決這樣一個(gè)雙分派問題:對(duì)于一個(gè)具體的方法,不僅跟接受訪問的對(duì)象類型有關(guān),還和訪問者的類型有關(guān)。這些模式最終產(chǎn)生一個(gè)拓?fù)浣Y(jié)構(gòu)像矩形的二維組合,每個(gè)組合都對(duì)應(yīng)一種具體的完整實(shí)現(xiàn)。
      
      層級(jí)
      
       設(shè)計(jì)類的層級(jí)結(jié)構(gòu)應(yīng)該盡量簡(jiǎn)單。樹形拓?fù)浣Y(jié)構(gòu)是一種常用的數(shù)據(jù)結(jié)構(gòu),適用于復(fù)雜問題的分而治之。靜態(tài)的繼承來對(duì)應(yīng)對(duì)象間的動(dòng)態(tài)的樹形關(guān)系并不靈活。組合模式將代表葉節(jié)點(diǎn)的類和容器的類繼承于共同的構(gòu)件類,統(tǒng)一兩者的接口,容器類返過來引用其基類構(gòu)件類。對(duì)象通過遞歸組合,靈活的構(gòu)成一個(gè)樹形的拓?fù)浣Y(jié)構(gòu)。運(yùn)用對(duì)象間的引用而不是類的繼承,可以減少所設(shè)計(jì)類的層次,同時(shí)增加靈活性。職責(zé)鏈模式將對(duì)象引用連成一條鏈,請(qǐng)求被依次傳遞,直到有某個(gè)對(duì)象的方法處理為止。對(duì)于層次復(fù)雜的聚合結(jié)構(gòu),使用迭代器模式能提供按一定順序訪問元素的方法,解耦程序的復(fù)雜性。另一與復(fù)雜層次有關(guān)聯(lián)的模式是解釋器模式,它用于定義并執(zhí)行一個(gè)文法的解釋。由于文法通常可以由較短的BNF表示且結(jié)構(gòu)較為固定,因此,解釋器的遞歸組合可以直接用繼承來對(duì)應(yīng)。
      
      集中
      
       某些模式體現(xiàn)出集中抽象的特點(diǎn)。在創(chuàng)建型模式中,單件模式可以保證類在實(shí)例化后只有一個(gè)全局集中的訪問點(diǎn)。在結(jié)構(gòu)型模式中,享元模式中少量類的享元對(duì)象被反復(fù)引用,大量的引用者集中于一個(gè)享元,外觀模式則將子系統(tǒng)的一組接口集中于一個(gè)高層接口,使得這一子系統(tǒng)更加易于使用。在行為型模式中,多個(gè)對(duì)象之間的行動(dòng)協(xié)調(diào)往往有一個(gè)指揮中樞,命令模式的中樞是命令類,觀察者模式則是被觀察類,中介者模式則是中介者。這些模式都是單分派機(jī)制的實(shí)現(xiàn):對(duì)于一個(gè)具體的方法,只跟一個(gè)對(duì)象的類型有關(guān)。在中介者模式和命令模式中,具體方法由發(fā)送請(qǐng)求的對(duì)象類型決定,而觀察者模式,則是由接受請(qǐng)求對(duì)象的類型決定。
      
      接口編程
      
       好的面向?qū)ο缶幊虘?yīng)當(dāng)對(duì)接口編程,而不是對(duì)實(shí)現(xiàn)編程,這樣做使得客戶無須知道使用對(duì)象的類型或?qū)崿F(xiàn),只需用抽象類中定義的已知接口操縱對(duì)象,這將極大地減少子系統(tǒng)實(shí)現(xiàn)之間的相互依賴。構(gòu)建型模式中的原型模式可以無須知道所創(chuàng)建對(duì)象類型,構(gòu)建者模式利用接口指導(dǎo)復(fù)雜對(duì)象的構(gòu)建,無須知道創(chuàng)建對(duì)象的具體實(shí)現(xiàn),工廠模式定義一個(gè)創(chuàng)建對(duì)象的接口,將一個(gè)類的實(shí)例化延遲至子類。在結(jié)構(gòu)型模式中,代理模式和裝飾模式都將一部分的功能分離,委托內(nèi)部實(shí)際實(shí)現(xiàn)或由外部的裝飾器一步步的增加功能。適配器模式則將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,這對(duì)于復(fù)用已有的代碼十分有用。在行為型模式中,模板方法模式定義一個(gè)操作中的算法的骨架,將一些步驟延遲到子類,方便修改算法的某個(gè)特定步驟。因此,它使用的是鉤子操作,父類方法空缺,由子類實(shí)現(xiàn),而不是抽象操作,子類調(diào)用父類的方法。策略模式和狀態(tài)模式收集所需的全部上下文,然后通過基類接口,委托具體的策略類或狀態(tài)類來實(shí)現(xiàn)實(shí)際的功能,用戶可以方便的替換策略或狀態(tài)的實(shí)現(xiàn)。
       觀察者模式其實(shí)是一種回調(diào)機(jī)制,而備忘錄模式現(xiàn)在常常被稱為序列化。
      
      語言無關(guān)
      
       設(shè)計(jì)模式是從“設(shè)計(jì)思路”的角度研究編程,理論上是和語言無關(guān)的,但是實(shí)踐中由于設(shè)計(jì)模式是從具體的案例總結(jié)而來的,因此在成文過程中不可避免的與特定的語言相關(guān)聯(lián)。由于C++、Java,設(shè)計(jì)模式通常是在上述的語境下所討論的。如果從今天的角度看,有些設(shè)計(jì)模式,與其說是發(fā)揮語言的特點(diǎn),倒不如說是在克服語言設(shè)計(jì)本身的不足。多年來計(jì)算機(jī)硬件飛速發(fā)展,動(dòng)態(tài)語言逐漸流行。動(dòng)態(tài)語言的特性,使得不少設(shè)計(jì)模式得到許多精簡(jiǎn)。
      
      動(dòng)態(tài)語言:一等公民
      
       在動(dòng)態(tài)語言中,類型是一等公民,不需要再通過繼承抽象類的方式預(yù)留公共接口,而且類的構(gòu)建也是動(dòng)態(tài)的,很多情況下不需要設(shè)計(jì)工廠類來構(gòu)建,所以抽象工廠模式、享元模式、工廠方法、狀態(tài)模式和指責(zé)鏈條模式這六種模式可以簡(jiǎn)化甚至不需要設(shè)計(jì)。同樣,函數(shù)在動(dòng)態(tài)語言中也是一等公民,命令模式實(shí)現(xiàn)更容易,另外策略模式、模板方法模式、訪問者模式這四種模式都能簡(jiǎn)化。
      
      廣義函數(shù)機(jī)制
      
       Lisp這種動(dòng)態(tài)語言的對(duì)象系統(tǒng),即CLOS標(biāo)準(zhǔn)不是基于消息機(jī)制,而是基于廣義函數(shù)機(jī)制。定義一個(gè)抽象的廣義函數(shù)后,通過特化滾廣義函數(shù)類型參數(shù)來定義一個(gè)具體的方法。這意味著方法不是屬于類,而是實(shí)際上屬于廣義函數(shù)。更關(guān)鍵的是,廣義函數(shù)的參數(shù)數(shù)量沒有限制,本質(zhì)上是一種多分派機(jī)制,不僅不需要設(shè)計(jì)訪問者模式來支持雙分派,而且可以實(shí)現(xiàn)任意多的分派。多分派特性又被稱為多重方法。構(gòu)建者模式完全可以用多重方法來實(shí)現(xiàn),因?yàn)闃?gòu)建函數(shù)的具體方法不僅與讀入標(biāo)記對(duì)象的內(nèi)容有關(guān),也和標(biāo)記對(duì)象的類型,被構(gòu)建對(duì)象的類型有關(guān)。
      
      方法組合
      
       當(dāng)廣義函數(shù)特化被調(diào)用時(shí),它會(huì)自動(dòng)將符合特化條件的方法收集起來,并且按照最特定的匹配優(yōu)先或者指定的順序來執(zhí)行。這種特點(diǎn)提供了一種叫做標(biāo)準(zhǔn)方法組合的技巧。中介者模式、觀察者模式這樣本質(zhì)上單分派的機(jī)制,可以用方法組合代替,比如在主方法的請(qǐng)求執(zhí)行后,用after:的輔助方法響應(yīng)執(zhí)行。
      
      宏與元編程
      
       Lisp的宏定義具有“元編程”的特點(diǎn)。它可以在普通代碼運(yùn)行前的宏時(shí)間預(yù)先處理代碼。這為編程語言提供了語法上的抽象,可以直接設(shè)計(jì)BNF范式對(duì)應(yīng)的宏來代替解釋器模式。Lisp正因?yàn)檫@個(gè)特點(diǎn)所以有眾多方言。Mathematica沒有宏,但是可以通過Hold和Release操作在代碼運(yùn)行之前,對(duì)其進(jìn)行操作,或者用ToString/ToExpression的組合,將代碼轉(zhuǎn)化成字符串,用正則表達(dá)式處理之后在轉(zhuǎn)化回表達(dá)式運(yùn)算,可以代替宏的功能,實(shí)現(xiàn)元編程。
       動(dòng)態(tài)語言往往有模塊機(jī)制,這樣我們可以建立統(tǒng)一的接口卻不再需要設(shè)計(jì)外觀模式,不需要要生成對(duì)象。
      
      多范式編程
      
       動(dòng)態(tài)語言除了傳統(tǒng)的指令式、遞歸式的編程范式外,還支持其它多范式編程。Mathematica支持函數(shù)式編程,基于lambda演算的函數(shù)式編程具有無副作用的特點(diǎn)。符號(hào)和方括號(hào)的組合可以看成是面向?qū)ο缶幊痰牟糠种С帧2贿^,Mathematica并不需要傳統(tǒng)意義上的面向?qū)ο笙到y(tǒng),因?yàn)閯?dòng)態(tài)語言不需要繼承一個(gè)公共的接口,一切都是動(dòng)態(tài)加載的,方法和符號(hào)的關(guān)系可以用“廣義函數(shù)”的角度來看待。
      
      邏輯編程
      
       Mathematic支持邏輯編程,即基于規(guī)則的編程。在Mathematica中,每一個(gè):=語句都會(huì)對(duì)符號(hào)對(duì)象生成對(duì)應(yīng)的:->匹配規(guī)則,可以簡(jiǎn)單的利用Mathematica內(nèi)置的許多數(shù)學(xué)規(guī)則進(jìn)行:=語句定義,也可以直接對(duì)符號(hào)聯(lián)系的所有:->匹配規(guī)則進(jìn)行修改,自定義的方式來進(jìn)行。
      
  •      曾經(jīng)聽人說過,看不懂一本書,不是由于書寫的不好,而是你無法領(lǐng)悟其中講述的內(nèi)涵。只有你經(jīng)歷過與作者類似的經(jīng)歷,才能明白作者所說。
       《設(shè)計(jì)模式》自從面世而來,經(jīng)過多次再版,經(jīng)久不衰。有人覺得內(nèi)容很抽象,無法理解。三年前,我第一次接觸設(shè)計(jì)模式時(shí),同樣對(duì)里面的實(shí)例和定義一頭霧水?,F(xiàn)在,翻起這本書,其中的23種模式,都能在做過的項(xiàng)目中找到蹤影。
       這本書并不適合多年前的我,卻適合現(xiàn)在的我。
 

250萬本中文圖書簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7