天天看點

《設計模式沉思錄》目錄—導讀

《設計模式沉思錄》目錄—導讀

版權聲明

設計模式沉思錄

authorized translation from the english language edition, entitled pattern hatching: design patterns applied, 9780201432930 by john vlissides, published by pearson education, inc., publishing as addison-wesley professional. copyright © 1998 pearson education, inc.

all rights reserved. no part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from pearson education, inc.

chinese simplified language edition published by pearson education asia ltd. and posts & telecom press copyright © 2015.

本書中文簡體字版由pearson education asia ltd.授權人民郵電出版社獨家出版。未經出版者書面許可,不得以任何方式複制或抄襲本書内容。

本書封面貼有pearson education(培生教育出版集團)雷射防僞标簽,無标簽者不得銷售。

版權所有,侵權必究。

内容提要

本書在gof的《設計模式》一書的基礎上進行了拓展,運用其中的概念,介紹了一些技巧,幫助讀者決定在不同的情況下應該使用哪些模式,以及不應該使用哪些模式。本書不僅對已有的一些模式提出新的見解,還讓讀者見證開發新模式的整個過程。

本書适合使用設計模式的軟體開發人員閱讀。

譯者序

我接下本書的翻譯工作的時候,正值《windows核心程式設計(第5版)》翻譯完成,中文版新書上架後沒多久。翻譯《windows核心程式設計(第5版)》耗時9個多月,這是與另外兩位譯者一起合作完成的一本700多頁的大部頭。這項工作讓我感覺有些疲憊,原本想好好歇一歇,不料卻邂逅本書。

最終,我無法拒絕,接下了本書的翻譯工作,主要出于兩方面的原因。首先,作為一名設計模式的擁護者和踐行者,我非常高興地看到另一本與設計模式有關的重要著作在問世10多年後即将在國内出版,同時也希望自己能夠為國内的設計模式社群盡一份綿薄之力。其次,本書的英文原版不到200頁,在翻譯了《.net設計規範》和《windows核心程式設計(第5版)》兩本譯作之後,我滿懷信心地認為自己應該可以很快完成。

事實很快證明我錯誤地估計了翻譯本書的工作量,而且錯得不輕。本書雖然短小,但卻當之無愧地是我翻譯過的最難的技術書籍,以至于在開工後不久我不得不向出版社告急,要求對原先的翻譯進度和出版計劃進行調整。這本不足200頁的書最終花了我将近半年的時間才完成,這遠遠超出了我的預期。出版社的編輯工作同樣反映了本書的難度,譯稿在2009年上半年就已傳遞給出版社進行編輯,但最終出版上架卻要到2010年初,其難度可見一斑。

正是由于這個原因,最初傳遞的中文版譯稿并未能完全達到我希望的流暢程度。對我來說,雖然我盡量追求譯文的準确和流暢,但當兩者不能兼得時,我會犧牲語言的流暢來保證内容的準确。在此我要感謝本書的編輯陳興璐小姐和圖靈公司的總經理武衛東先生,是他們的編輯和潤色使得本書變得更加流暢。即便如此,書中難免還會存在一些生澀的字句和不夠流暢的地方,甚至是錯誤之處。作為譯者,我對此負有全部責任。為此我建立了一份網上勘誤表, 如果讀者發現任何錯誤,都請通過該網頁與我聯系,一旦确認我會立即将其更新到勘誤表中。勘誤表的網址為www.gesoftfactory.com/ge/pattern-hatching/。

我要感謝我的同僚吳宇進、田超和張險峰,是他們在繁忙的工作之餘審閱譯稿,提出了許多寶貴的意見和建議,進而使得本書的品質更上一層樓。最後,我要感謝我的妻兒,他們的支援和鼓勵,是我前進的動力。

本書不僅通過一些通俗易懂的執行個體對如何運用設計模式進行了深入的講解,而且還介紹了一些新的設計模式。但與其他的設計模式書籍相比,本書的獨特之處在于向讀者揭開了模式開發的神秘面紗,讓讀者了解模式背後鮮為人知的一些故事,并領略其中的苦與樂。我滿懷着激動和忐忑之情,将這本設計模式領域的重要著作的中文版呈現給國内的廣大讀者。希望本書能夠幫助你們更好地了解和運用設計模式,甚至有朝一日編寫出自己的模式!

葛子昂

2010年3月

john寫信告訴我,他打算為c++ report撰寫模式專欄,他的這個決定填補了我生命中的一個空白。具體來說,他一年填補了大概5個空白——那時我正在撰寫一個關于模式的專欄,每兩個月一期,stan lippman建議我和john輪流撰寫。john主要關注設計模式,而我在專欄中将繼續關注更為廣泛的主題。我們倆搭檔把模式介紹給c++社群,對此我感到興奮。不僅如此,我也喜歡john介紹這個主題的方式。我在給他的信中寫到:

孵化(hatching)的比喻不僅讨人喜歡,而且很有道理。我剛剛又閱讀了alexander的notes on systhesis第2版的前言,顯然他認為對那些潛藏在自然中的事物,我們應該去挖掘和發現它們,而不是關注創造它們的“方法”,甚或是從其璀璨的裂縫中窺探它們。

能夠與gof(模式四人組)之一共同寫專欄,我不僅感到高興,更感到榮幸。如果沒有gof的《設計模式》一書,讀者也許都不曾聽說過模式。通過對模式的介紹,該書成為了這個全新科目的極佳教材。gof的23個設計模式奠定了一個不大但卻非凡的基礎,并發展壯大成為我們今天知道的模式社群。而憑借本書讀者可以直接深入了解gof作者之一john的思考過程,同樣對更加廣闊的過程有一些間接的了解。

為了總結出一個好模式,突破一些局限在所難免,就像小雞破殼而出,而john的專欄對那些在《設計模式》背後發生的“破殼”的對話進行了探索。例如,john在類結構不斷演變的情況下,對visitor的限制進行了探索。他還談論了一些模式,比如generation gap(見本書的第3章)。這些模式未能被收錄到《設計模式》中,但它們可能已經足夠好了,值得公之于衆。讀者會發現gof關于multicast模式的對話,這段對話讓john陷入沉思:“一旦了解了我們在模式開發過程中所經曆的混亂,那些認為gof具備非凡能力的人一定會感到震驚。”本書傳達了一個重要的事實,它沒有出現在更為學術化和更加完善的《設計模式》一書中:模式源自一群認真努力的程式員,雖然他們不可能每次一開始就把事情都做對,但他們努力地讓那些重複出現的設計實踐變得實用。我認為閱讀本書的模式使用者将會感謝gof為他們的模式而付出的心血,我還認為閱讀本書的模式編寫者在今後發掘和編寫模式時會比以前更加謙遜和勤勉。

亂中求序是自然科學的主旋律,那麼,我們不應該認為設計的科學會有任何的不同之處。模式是人們在工作中共同發現一些構成人們高品質生活的因素,并将它們加以記錄的整個過程。這不可避免是個有機過程。貫穿本書,讀者将得以洞察各模式背後的有機過程,得以了解普通(但非常有經驗而且非常盡職的)軟體開發人員在努力形成自己對設計的了解時的思考過程。《設計模式》是對他們集體了解的提煉,而本書是對産生了解的過程的提煉,我們不應該低估它在解釋gof模式方面所帶來的價值。請允許我引用一封我在1997年晚些時候收到的來自richard helm的信,我相信它進一步證明了這一點。

gof的設計模式隻解決了微觀架構(micro-architecture)。你仍然必須把宏觀架構(macro-architecture)設計好:分層、分布、功能隔離……。而且就像cope說的,你仍然必須把納米架構(nano-architecture)設計好:封裝、liskov……。在所有這些中的某個地方,你也許會用到一個模式,也許用不上。即使用上了,也可能和某本書中的介紹和描述很不一樣。

這本書将幫助你了解如何将《設計模式》——其實是任何關于設計模式的書籍——當作一本珍貴的指南,而不是當作一些累贅的規定。它可以幫助你在更廣闊的面向對象設計的基本原則下,将設計模式運用到合适的地方。它道出了雖然不正式但卻嚴格的标準和緊張的疊代過程,《設計模式》中的23個模式正是基于這樣的标準,經曆了這樣的疊代過程産生的。知道有這樣的過程,以及這樣的過程如何發生,讓人感到釋然,因為它把模式帶回到更加講究實用的日常工作中。我認為這将有助于讀者認識到必須根據手頭的問題來對模式進行調整,有助于讀者加入自己的思考而不僅僅是盲目地遵循“某本書中說過的”教條。我不認為計算機科學家會喜歡這本書,但現實的程式員會反複品味,獲得共鳴,并高度欣賞它。

james o. coplien

朗訊科技公司

貝爾實驗室

前言

我永遠不會忘記1994年秋天的那個下午。那天我收到一封來自stan lippman(時任c++ report雜志的主編)的電子郵件,他邀我為該雜志撰寫一個專欄,該專欄每兩個月一期。

我們算得上是老相識了,早在他參觀watson實驗室的時候我們就認識了。那一次我們簡單地聊了他在開發工具方面所做的工作,以及gof在模式方面所做的工作。與那時大多數人不一樣的是,stan熟悉模式的概念——他接連閱讀了《設計模式》的一些預覽本,并說過一些令人鼓舞的話。盡管如此,我們的談話很快就轉移到了寫作上。随着談話的進行,我記得自己愈加炫耀起來,仿佛我已經不是自己了。而stan,這位知名的專欄作家,是兩本非常成功的圖書(還有一本即将出版)的作者,卻稱自己的寫作隻是業餘水準。我不清楚我們的談話是否讓他感到愉快,還是在他的下一個約會之前他一直都在耐着性子和我談話。(此後我認識到,如果還有什麼能勝過stan的忍耐力,那就是他的真誠!)

幾個月後我收到他的電子郵件,心潮起伏,此前的歉疚感就不值一提了。想象着自己為全球的讀者定期撰寫專欄,這既讓我興奮,又讓我恐懼。寫了幾次之後我是否還能繼續?人們是否在乎我寫些什麼?我應該寫些什麼?我寫的東西對别人是否有幫助?

我在恐懼中沉溺了将近一小時。然後我想起我父親的一些告誡:局促不安隻能使人無所作為。隻要關注最基本的東西,其他東西會随之而來的。“隻管去做”(just do it),他說這句話比耐克要早得多。

于是我就接受了。

選擇專欄主題非常容易。那時我深陷于模式的研究中已有三年了。我們最近剛完成《設計模式》,但我們都知道它遠遠沒有說完這個話題。專欄會是一個很好的論壇,可以對《設計模式》一書進行解釋,可以對它進行擴充,還可以在新問題出現時展開讨論。如果說專欄有助于《設計模式》圖書的銷售,那也無妨,隻要它立場公正,不亂吹噓。

現在,我的“模式孵化”專欄已經連載了10多篇文章了,回過頭看,我的恐懼是沒有依據的。我從來沒有因為要找東西寫而為難,而且寫作時我樂在其中。我還從世界各地收到了大量令人鼓舞的回報,包括一些人要求閱讀過去的專欄,而且這樣的要求一再出現。後來我想到了把我的專欄,以及其他一些尚未發表的關于模式的材料,彙編在一起提供給大家。

本書就是要達到這個目的。讀者将在書中找到我前三年專欄寫作生涯中的思考和想法,其中包括發表在c++ report和object magazine中的所有文章,加上一些零碎的新見解。我按照邏輯的順序來組織内容,而不是通過時間順序來組織内容,其目的是為了使所有的内容能夠像書本一樣連貫。這樣的組織比我想象的要容易一些,因為許多文章既是這個系列的一部分,又是那個系列的一部分,當然這仍然需要耗費大量的精力。我衷心地希望讀者能夠喜歡最終的結果。

緻謝

一如既往,我要感謝許多人為我提供各種各樣的幫助。首先最重要的是我的gof成員——erich gamma、richard helm以及ralph johnson。他們每一個人都在不同的時刻為我提供了寶貴的回報,這些回報彙集在一起使本書成為了一本更加不同(當然是更好)的圖書。我們幾人互補性強,如同天成,遇見他們是我三生有幸,我由衷地感謝他們。

然而,同樣的幫助也來自其他人。還有許多人花時間研讀草稿,為的是找出不合邏輯的論述、不當的言辭,以及大家都再熟悉不過的筆誤。他們是bruce anderson、bard bloom、frank buschmann、jim coplien、rey crisostomo、wim de pauw、kirk knoernschild、john lakos、doug lea、bob martin、dirk riehle以及doug schmidt。特别感謝jim,他是我在c++ report的拍擋,不僅因為他為本書作序,更因為他是如此多才多藝,總是激勵我奮進。

接下來要感謝的完全是一些陌生人,他們給我發電子郵件問我問題,提出意見,糾正我的錯誤,并給我以善意的責備。有許多這樣的人,在這裡我隻列出了本書引用了他們的話的人,或者他們的意見與本書直接相關的人:mark betz、laurion burchall、chris clark、richard gyger、michael hittesdorf、michael mccosker、scott meyers、tim peierls、paul pelletier、ranjiv sharma、david van camp、gerolf wendland和barbara zino。雖然很多人我沒有提到名字,請相信我同樣感謝你們的回報。

最後,我要感謝兩個家庭,一個是我自己的家人,另一個是我親如一家的同僚,你們對我的支援我無以言表。我欠你們的太多了。

j.v.

[email protected]

1998年1月于紐約州霍索恩市

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

目錄

<a href="https://yq.aliyun.com/articles/93399">第1章 介紹</a>

<a href="https://yq.aliyun.com/articles/93399">1.1節對模式的十大誤解</a>

<a href="https://yq.aliyun.com/articles/93401">1.2節觀察</a>

<a href="https://yq.aliyun.com/articles/93410">第2章 運用模式進行設計</a>

<a href="https://yq.aliyun.com/articles/93410">2.1節基礎</a>

<a href="https://yq.aliyun.com/articles/93414">2.2節孤兒、孤兒的收養以及代用品</a>

<a href="https://yq.aliyun.com/articles/93419">2.3節“但是應該如何引入代用品呢?”</a>

<a href="https://yq.aliyun.com/articles/93422">2.4節通路權限</a>

<a href="https://yq.aliyun.com/articles/93426">2.5節關于visitor的一些警告</a>

<a href="https://yq.aliyun.com/articles/93427">2.6節單使用者檔案系統的保護</a>

<a href="https://yq.aliyun.com/articles/93438">2.7節多使用者檔案系統的保護</a>

<a href="https://yq.aliyun.com/articles/93443">2.8節小結</a>

第3章 主體和變體

第4章 愛的奉獻

第5章 高效模式編寫者的7個習慣

參考文獻

歡迎來到異步社群!