設計模式(電腦) - 維基百科,自由的百科全書

文章推薦指數: 80 %
投票人數:10人

在軟體工程中,設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。

這個術語是由埃里希·伽瑪(Erich Gamma)等人在1990年代 ... 設計模式(電腦) 維基百科,自由的百科全書 跳至導覽 跳至搜尋 本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。

此條目需要補充更多來源。

(2018年10月22日)請協助補充多方面可靠來源以改善這篇條目,無法查證的內容可能會因為異議提出而移除。

致使用者:請搜尋一下條目的標題(來源搜尋:"設計模式(計算機)"—網頁、新聞、書籍、學術、圖像),以檢查網路上是否存在該主題的更多可靠來源(判定指引)。

此條目可參照英語維基百科相應條目來擴充。

(2020年9月27日)若您熟悉來源語言和主題,請協助參考外語維基百科擴充條目。

請勿直接提交機械翻譯,也不要翻譯不可靠、低品質內容。

依版權協議,譯文需在編輯摘要註明來源,或於討論頁頂部標記{{Translatedpage}}標籤。

在軟體工程中,設計模式(designpattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。

這個術語是由埃里希·伽瑪(ErichGamma)等人在1990年代從建築設計領域引入到計算機科學的。

設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。

物件導向設計模式通常以類別或物件來描述其中的關係和相互作用,但不涉及用來完成應用程式的特定類別或物件。

設計模式能使不穩定依賴於相對穩定、具體依賴於相對抽象,避免會引起麻煩的緊耦合,以增強軟體設計面對並適應變化的能力。

並非所有的軟體模式都是設計模式,設計模式特指軟體「設計」層次上的問題。

還有其他非設計模式的模式,如架構模式。

同時,演算法不能算是一種設計模式,因為演算法主要是用來解決計算上的問題,而非設計上的問題。

隨著軟體開發社群對設計模式的興趣日益增長,已經出版了一些相關的專著,定期召開相應的研討會,而且沃德·坎寧安(WardCunningham)為此發明了WikiWiki用來交流設計模式的經驗。

目次 1發展歷史 2表述格式 3分類 4參閱 5參考資料 6外部連結 發展歷史[編輯] 建築師克里斯托佛·亞歷山大在1977/79年編制了一本匯集設計模式的書,但是這種設計模式的思想在建築設計領域裡的影響遠沒有後來在軟體開發領域裡傳播的廣泛。

肯特·貝克和沃德·坎寧安在1987年,利用克里斯托佛·亞歷山大在建築設計領域裡的思想開發了設計模式,並把此思想應用在Smalltalk中的圖形使用者介面(GUI)的生成中。

一年後,埃里希·伽瑪在他的蘇黎世大學博士畢業論文中開始嘗試把這種思想覆寫為適用於軟體開發。

與此同時JamesCoplien在1989年至1991年也在利用相同的思想致力於C++的開發,而後於1991年發表了他的著作AdvancedC++ProgrammingStylesandIdioms。

同年,ErichGamma得到了博士學位,然後去了美國,在那與RichardHelm、RalphJohnson、JohnVlissides合作出版了《設計模式:可復用物件導向軟體的基礎》(DesignPatterns-ElementsofReusableObject-OrientedSoftware)一書,在此書中共收錄了23種設計模式。

這四位作者在軟體開發領域裡以「四人幫」(英語,GangofFour,簡稱GoF)而聞名,並且他們在此書中的協同運作導致了軟體設計模式的突破。

有時,GoF也會用於代指《設計模式》這本書。

表述格式[編輯] 表述一個軟體設計模式的格式根據作者的不同,劃分和名稱等都會有所不同。

常用的GoF描述模式的格式大致分為以下這些部分: 模式名:每一個模式都有自己的名字,模式的名字使得我們可以討論我們的設計。

問題:在物件導向的系統設計過程中反覆出現的特定場合,它導致我們採用某個模式。

解決方案:上述問題的解決方案,其內容給出了設計的各個組成部分,它們之間的關係、職責劃分和協同運作方式。

別名:一個模式可以有超過一個以上的名稱。

這些名稱應該要在這一節註明。

動機:在哪種情況使用該模式,是本節提供的方案(包括問題與來龍去脈)的責任。

適用性:模式適用於哪些情況、模式的背景等等。

結構:這部分常用類圖與互動圖闡述此模式。

參與者:這部分提供一份本模式用到的類與物件清單,與它們在設計下扮演的角色。

合作:描述在此模式下,類與物件間的互動。

影響:採用該模式對軟體系統其他部分的影響,比如對系統的擴充性、可移植性的影響。

影響也包括負面的影響。

這部分應描述使用本模式後的結果、副作用、與權衡(trade-off)。

實作:這部分應描述實現該模式、該模式的部分方案、實現該模式的可能技術、或者建議實現模式的方法。

範例:簡略描繪出如何以程式語言來使用模式。

已知應用:業界已知的實作範例。

相關模式:這部分包括其他相關模式,以及與其他類似模式的不同。

分類[編輯] 《設計模式》一書原先把設計模式分為建立型模式、結構型模式、行為型模式,把它們通過授權、聚合、診斷的概念來描述。

若想更進一步了解關於物件導向設計的背景,參考介面模式、內聚性。

若想更進一步了解關於物件導向程式設計的背景,參考繼承,介面,多型。

劃分類型 模式名稱 描述 《設計模式》中提及 《代碼大全》中提及[1] 建立型模式 抽象工廠模式 為一個產品族提供了統一的建立介面。

當需要這個產品族的某一系列的時候,可以從抽象工廠中選出相應的系列建立一個具體的工廠類。

是 是 工廠方法模式 定義一個介面用於建立物件,但是讓子類決定初始化哪個類。

工廠方法把一個類的初始化下放到子類。

是 是 生成器模式 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

是 否 惰性初始模式 推遲物件的建立、資料的計算等需要耗費較多資源的操作,只有在第一次存取的時候才執行。

否 否 物件池模式 通過回收利用物件避免取得和釋放資源所需的昂貴成本。

否 否 原型模式 用原型實例指定建立物件的種類,並且通過拷貝這些原型,建立新的物件。

是 否 單例模式 確保一個類只有一個實例,並提供對該實例的全域存取。

是 是 多例模式(英語:Multitonpattern) 確保一個類只有命名的實例,並提供對這些實例的全域存取。

否 否 資源取得為初始化 通過繫結到合適物件的生命周期來確保資源被適當地釋放。

否 否 結構型模式 配接器模式 將某個類的介面轉換成客戶端期望的另一個介面表示。

配接器模式可以消除由於介面不匹配所造成的類相容性問題。

是 是 橋接模式 將一個抽象與實現解耦,以便兩者可以獨立的變化。

是 是 組合模式(英語:Compositepattern) 把多個物件組成樹狀結構來表示局部與整體,這樣使用者可以一樣的對待單個物件和物件的組合。

是 是 修飾模式 向某個物件動態地添加更多的功能。

修飾模式是除類繼承外另一種擴充功能的方法。

是 是 外觀模式 為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

是 是 享元 通過共享以便有效的支援大量小顆粒物件。

是 否 代理 為其他物件提供一個代理以控制對這個物件的存取。

是 否 行為型模式 黑板(英語:Blackboard(designpattern)) 廣義的觀察者在系統範圍內交流資訊,允許多位讀者和寫者。

否 否 責任鏈 為解除請求的傳送者和接收者之間耦合,而使多個物件都有機會處理這個請求。

將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它。

是 否 命令 將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求紀錄檔,以及支援可取消的操作。

是 否 直譯器(英語:Interpreterpattern) 給定一個語言,定義它的文法的一種表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。

是 否 迭代器 提供一種方法順序存取一個聚合物件中各個元素,而又不需暴露該物件的內部表示。

是 是 中介者 包裝了一系列物件相互作用的方式,使得這些物件不必相互明顯作用,從而使它們可以鬆散偶合。

當某些物件之間的作用發生改變時,不會立即影響其他的一些物件之間的作用,保證這些作用可以彼此獨立的變化。

是 否 備忘錄(英語:Mementopattern) 備忘錄物件是一個用來儲存另外一個物件內部狀態的快照的物件。

備忘錄模式的用意是在不破壞封裝的條件下,將一個物件的狀態捉住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。

是 否 空物件 通過提供預設物件來避免空參照。

否 是 觀察者模式 在物件間定義一個一對多的聯絡性,由此當一個物件改變了狀態,所有其他相關的物件會被通知並且自動重新整理。

是 是 規格(英語:Specificationpattern) 以布林形式表示的可重繫結的商業邏輯。

否 否 狀態(英語:Statepattern) 讓一個物件在其內部狀態改變的時候,其行為也隨之改變。

狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。

當系統的狀態變化時,系統便改變所選的子類。

是 否 策略 定義一個演算法的系列,將其各個分裝,並且使他們有互動性。

策略模式使得演算法在使用者使用的時候能獨立的改變。

是 是 模板方法 模板方法模式準備一個抽象類,將部分邏輯以具體方法及具體構造子類的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。

不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。

先構建一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。

是 是 存取者 封裝一些施加於某種資料結構元素之上的操作。

一旦這些操作需要修改,接受這個操作的資料結構可以保持不變。

存取者模式適用於資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。

是 否 併發型模式 主動物件 否 否 阻礙 否 否 雙重檢查鎖定 否 否 守衛 否 否 領導者/追隨者 否 否 監測物件模式 否 否 讀寫鎖 否 否 排程 否 否 執行緒池模式 否 否 執行緒特定儲存 否 否 反應器 否 否 參閱[編輯] 設計範例 反模式,對某個問題經常出現的、在設計中應該儘量避免的、壞的設計方案。

模式挖掘 軟體重構 程式設計實踐 參考資料[編輯] ^McConnell,Steve.DesigninConstruction.CodeComplete2ndedition.MicrosoftPress.June2004:104.ISBN 978-0735619678.Table5.1PopularDesignPatterns 引文格式1維護:冗餘文字(link) ErichGamma,RichardHelm,RalphJohnson,andJohnVlissides:DesignPatterns,Addison-Wesley,1995,hardcover,395pages,ISBN978-0-201-63361-0,DesignPatternsCD,1997ISBN978-0-201-63498-3 FrankBuschmann,RegineMeunier,HansRohnert,PeterSommerlad,MichaelStal:Pattern-orientedSoftwareArchitecture,Volume1:ASystemofPatterns,JohnWiley&SonsLtd.,ISBN978-0-471-95869-7 DouglasSchmidt:Pattern-orientedSoftwareArchitecture.Volume2:PatternsforConcurrentandNetworkedObjects,JohnWiley&SonsLtd.,ISBN978-0-471-60695-6 AlanShalloway,JamesR.Trott:DesignPatternsExplained:ANewPerspectiveonObject-OrientedDesign,Addison-Wesley,ISBN978-0-201-71594-1 MartinFowler:PatternsofEnterpriseApplicationArchitecture,Addison-Wesley,ISBN978-0-321-12742-6 外部連結[編輯] JavaJ2EE模式目錄(頁面存檔備份,存於網際網路檔案館) 設計模式列表(頁面存檔備份,存於網際網路檔案館). mgrand的書介紹了許多模式 hillside.net模式目錄 設計模式會通(頁面存檔備份,存於網際網路檔案館) 設計模式工具箱(頁面存檔備份,存於網際網路檔案館) C#面向物件設計模式縱橫談系列課程(頁面存檔備份,存於網際網路檔案館) 設計模式目錄(頁面存檔備份,存於網際網路檔案館) 閱論編軟體設計模式設計模式建立型 抽象工廠 生成器 工廠方法 惰性初始 原型 單例 結構型 配接器 橋接 Composite(英語:Compositepattern) 修飾 外觀 享元 代理 行為型 責任鏈 命令 Interpreter(英語:Interpreterpattern) 迭代器 中介者 Memento(英語:Mementopattern) 觀察者 Specification(英語:Specificationpattern) State(英語:Statepattern) 策略 模板方法 存取者 函數式 么半群 函子 應用式 單子 Comonad Freemonad HOF 柯里化 函式複合(英語:Functioncomposition(computerscience)) 閉包 生成器 並列模式 主動物件(英語:Activeobject) 阻止(英語:Balkingpattern) Bindingproperties(英語:Bindingpropertiespattern) 雙重檢查鎖定模式 非同步方法呼叫 Future與promise Guardedsuspension(英語:Guardedsuspension) Join(英語:Join-pattern) 鎖 Messaging(英語:Messagingpattern) 監視器 Proactor(英語:Proactorpattern) 反應器 讀寫鎖 排程 執行緒池 Thread-localstorage(英語:Thread-localstorage) 架構模式 ADR(英語:Action–Domain–Responder) 主動記錄 Broker(英語:Brokerpattern) 主從式架構 cbd DAO DDD Datatransferobject(英語:Datatransferobject) Frontcontroller(英語:Frontcontroller) Identitymap(英語:Identitymappattern) Interceptor(英語:Interceptorpattern) 控制反轉 MVC 微服務 MVP 單體式應用程式 多層架構 n-tier(英語:Multitierarchitecture) Nakedobjects(英語:Nakedobjects) P2P 發布/訂閱 REST SOA Specification(英語:Specificationpattern) 執行緒局部儲存 雲分散式 斷路器 CQRS(英語:Command–queryseparation) 補償交易(英語:CompensatingTransaction) 索引表 領導者選舉(英語:Leaderelection) MapReduce 物化視圖(英語:Materializedview) 管道 過濾器(英語:Filter(software)) 發布/訂閱 分片(英語:Shard(databasearchitecture)) 節流(英語:Throttlingprocess(computing)) 其他模式 Blackboard(英語:Blackboarddesignpattern) Businessdelegate(英語:Businessdelegatepattern) Compositeentity(英語:Compositeentitypattern) 委託 依賴注入 Interceptingfilter(英語:Interceptingfilterpattern) 惰性載入 Methodchaining(英語:Methodchaining) 類比物件 空物件 物件池 Servant(英語:Servant(designpattern)) Twin(英語:Twinpattern) Typetunnel(英語:TypeTunnelpattern) 書籍 設計模式:可復用物件導向軟體的基礎 企業整合模式(英語:EnterpriseIntegrationPatterns) 人物 克里斯托佛·亞歷山大 埃里希·伽瑪 RalphJohnson(英語:RalphJohnson(computerscientist)) JohnVlissides(英語:JohnVlissides) 葛來迪·布區 肯特·貝克 沃德·坎寧安 馬丁·福勒 RobertMartin(英語:RobertCecilMartin) JimCoplien(英語:JimCoplien) DouglasSchmidt(英語:DouglasC.Schmidt) LindaRising 社群 TheHillsideGroup(英語:TheHillsideGroup) ThePortlandPatternRepository(英語:PortlandPatternRepository) 規範控制 GND:4546895-3 LCCN:sh98003823 取自「https://zh.wikipedia.org/w/index.php?title=设计模式_(计算机)&oldid=65669209」 分類:​軟體設計模式隱藏分類:​引文格式1維護:冗餘文本自2018年10月需補充來源的條目拒絕當選首頁新條目推薦欄目的條目自2020年9月需要從英語維基百科翻譯的條目需要從英語維基百科翻譯的條目含有多個問題的條目含有英語的條目包含GND標識符的維基百科條目包含LCCN標識符的維基百科條目使用ISBN魔術連結的頁面 導覽選單 個人工具 沒有登入討論貢獻建立帳號登入 命名空間 條目討論 臺灣正體 不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體 查看 閱讀編輯檢視歷史 更多 搜尋 導航 首頁分類索引特色內容新聞動態近期變更隨機條目資助維基百科 說明 說明維基社群方針與指引互助客棧知識問答字詞轉換IRC即時聊天聯絡我們關於維基百科 工具 連結至此的頁面相關變更上傳檔案特殊頁面靜態連結頁面資訊引用此頁面維基數據項目 列印/匯出 下載為PDF可列印版 其他專案 維基共享資源 其他語言 AfrikaansAlemannischالعربيةAsturianuБългарскиBosanskiCatalàČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiفارسیSuomiFrançaisGalegoעבריתहिन्दीMagyarՀայերենInterlinguaBahasaIndonesiaItaliano日本語Қазақша한국어LietuviųLatviešuമലയാളംМонголNederlandsNorskbokmålPolskiPortuguêsРусскийSrpskohrvatski/српскохрватскиSimpleEnglishСрпски/srpskiSvenskaதமிழ்ไทยTürkçeУкраїнськаTiếngViệt粵語IsiZulu 編輯連結



請為這篇文章評分?