設計模式(Design pattern)是一套被重複使用、多數(shù)人知曉的、經(jīng)過分類編目的、程式碼設計經(jīng)驗的總結(jié)。使用設計模式是為了可重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。毫無疑問,設計模式於己於他人於系統(tǒng)都是多贏的;設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結(jié)構(gòu)一樣。
設計模式(英語 design pattern)是對面向?qū)ο笤O計中反復出現(xiàn)的問題的解決方案。這個術(shù)語是在1990年代由Erich Gamma等人從建筑設計領(lǐng)域引入到計算機科學中來的。這個術(shù)語的含義還存有爭議。算法不是設計模式,因為算法致力于解決問題而非設計問題。設計模式通常描述了一組相互緊密作用的類與對象。設計模式提供一種討論軟件設計的公共語言,使得熟練設計者的設計經(jīng)驗可以被初學者和其他設計者掌握。設計模式還為軟件重構(gòu)提供了目標。
隨著軟件開發(fā)社群對設計模式的興趣日益增長,已經(jīng)出版了一些相關(guān)的專著,定期召開相應的研討會,而且Ward Cunningham為此發(fā)明了WikiWiki用來交流設計模式的經(jīng)驗。
提示:本教程將通過?Java?實例,一步一步向您講解設計模式的概念。所以你需要對Java知識有所了解。
表述格式
表述一個軟件設計模式的格式根據(jù)作者的不同,劃分和名稱等都會有所不同。常用的GoF描述模式的格式大致分為以下這些部分:
模式名:每一個模式都有自己的名字,模式的名字使得我們可以討論我們的設計。
問題:在面向?qū)ο蟮南到y(tǒng)設計過程中反復出現(xiàn)的特定場合,它導致我們采用某個模式。
解決方案:上述問題的解決方案,其內(nèi)容給出了設計的各個組成部分,它們之間的關(guān)系、職責劃分和協(xié)作方式。
別名:一個模式可以有超過一個以上的名稱。這些名稱應該要在這一節(jié)注明。
動機:在哪種情況使用該模式,是本節(jié)提供的方案(包括問題與來龍去脈)的責任。
適用性:模式適用于哪些情況、模式的背景等等。
結(jié)構(gòu):這部分常用類圖與交互圖闡述此模式。
參與者:這部分提供一份本模式用到的類與對象清單,與它們在設計下扮演的角色。
合作:描述在此模式下,類與對象間的交互。
影響:采用該模式對軟件系統(tǒng)其他部分的影響,比如對系統(tǒng)的擴充性、可移植性的影響。影響也包括負面的影響。這部分應描述使用本模式后的結(jié)果、副作用、與權(quán)衡(trade-off)
實現(xiàn):這部分應描述實現(xiàn)該模式、該模式的部分方案、實現(xiàn)該模式的可能技術(shù)、或者建議實現(xiàn)模式的方法。
示例:簡略描繪出如何以編程語言來使用模式。
已知應用:業(yè)界已知的實現(xiàn)示例。
相關(guān)模式:這部分包括其他相關(guān)模式,以及與其他類似模式的不同。
提示:我們的《設計模式》教學將幫助您學習所有設計模式知識。如果你有任何疑問,請前往PHP中文網(wǎng)社群提出你的問題,會有熱心網(wǎng)友為你解答。
模式原則
大家都開始注意設計模式。那麼,到底我們?yōu)槭颤N要用設計模式呢?這麼多設計模式為什麼要怎麼設計呢?
說實話,以前我還真沒搞清楚。就是看大家一口一個"Design pattern",心就有點發(fā)虛。於是就買了本"四人幫"的設計模式,結(jié)果看得似懂非懂:看得時候好像是懂了,過一會兒就忘了??赡苁潜救吮容^"愚鈍"吧:))最近,有了點感悟。 "獨樂不如眾樂",與大家分享一下,還望指教!?
為什麼要提倡"Design Pattern"呢?根本原因是為了程式碼復用,增加可維護性。
那麼要怎麼實現(xiàn)程式碼重複使用呢? OO界有前輩的幾個原則:"開-閉"原則(Open Closed Principal)、里氏代換原則、合成復用原則。設計模式就是實現(xiàn)了這些原則,因此達到了程式碼重複使用、增加可維護性的目的。
開-閉原則
此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。是說模組應對擴充開放,而對修改關(guān)閉。模組應盡量在不修改原(是"原",指原來的程式碼)程式碼的情況下進行擴充。那要怎麼擴展呢?我們看工廠模式"factory pattern":假設中關(guān)村有一個賣盜版盤和毛片的小子,我們給他設計一"光碟銷售管理軟體"。我們應該先設計一"光碟"介面。如圖:【pre】______________|<>|| 光碟 ||_____________|| 賣() || ||_____________|【/pre】而盜版盤和毛片是其子類。小子透過"DiscFactory"來管理這些光碟。代碼為:
publicclassDiscFactory{ publicstatic光盤 getDisc(Stringname){ return(光盤)Class.forName(name).getInstance(); } }
有人要買盜版盤,要怎麼實現(xiàn)?
public class 小子{ public static void main(String【】 args){ 光碟d=DiscFactory.getDisc("盜版碟"); 光碟.賣(); } }
#如果有有一天,這小子良心發(fā)現(xiàn)了,開始賣正版軟體。沒關(guān)係,我們只要再創(chuàng)建一個"光碟"的子類"正版軟體"就可以了。不需要修改原結(jié)構(gòu)和程式碼。怎麼樣?對擴充開放,對修改關(guān)閉。 "開-閉原則" 工廠模式是對具體產(chǎn)品進行擴展,有的項目可能需要更多的擴展性,要對這個"工廠"也進行擴展,那就成了"抽象工廠模式"。
里氏代換原則
里氏代換原則是由"Barbara Liskov"提出的。如果呼叫的是父類別的話,那麼換成子類別也完全可以運作。例如: 光碟 d=new 盜版盤(); d.賣(); 要將"盜版盤"類改為"毛片"類,沒問題,完全可以運行。 Java編譯程式會檢查程式是否符合里氏代換原則。還記得java繼承的一個原則嗎?子類別override方法的存取權(quán)限不能小於父類別對應方法的存取權(quán)限。例如"光碟"中的方法"賣"存取權(quán)限是"public",那麼"盜版盤"和"毛片"中的"賣"方法就不能是protected或private,編譯不能通過。為什麼要這樣呢?你想?。喝绻?盜版盤"的"賣"方法是private。那麼下面這段程式碼就不能執(zhí)行了: 光碟 d=new 盜版盤(); d.賣();可以說:里氏代換原則是繼承復用的一個基礎(chǔ)。
合成復用原則
就是要少用繼承,多用合成關(guān)係來實現(xiàn)。我曾經(jīng)這樣寫過程式:有幾個類別要與資料庫打交道,就寫了一個資料庫操作的類,然後別的跟資料庫打交道的類別都繼承這個。結(jié)果後來,我修改了資料庫操作類別的一個方法,各個類別都需要改動。 "牽一發(fā)而動全身"!物件導向是要把波動限制在盡量小的範圍。
在Java中,應盡量針對Interface編程,而非實作類別。這樣,更換子類別不會影響呼叫它方法的程式碼。要讓各個類別盡可能少的跟別人聯(lián)繫,"不要與陌生人說話"。這樣,城門失火,才不至於殃及池魚。擴展性和維護性才能提高
了解這些原則,再看設計模式,只是在具體問題上怎麼實現(xiàn)這些原則而已。張無忌學太極拳,忘了所有招式,打倒了"玄冪二老",所謂"心中無招"。設計模式可謂招數(shù),如果先學通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑! (JR)
依賴倒轉(zhuǎn)原則抽像不應該依賴與細節(jié),細節(jié)應依
依賴倒轉(zhuǎn)原則
- #要針對介面編程,而不是針對實作編程。傳遞參數(shù),或在組合聚合關(guān)係中,盡量引用層次高的類別。主要是在建構(gòu)對象時可以動態(tài)的創(chuàng)建各種具體對象,當然如果一些具體類比較穩(wěn)定,就不必在弄一個抽象類做它的父類,這樣有畫舌添足的感覺接口隔離原則定制服務的例子,每一
- 一種角色,不多不少,不干不該幹的事,該幹的事都要乾抽象類別抽象類別不會有實例#######抽象類別###
類別為子類別繼承,一般包含這個系的共同屬性和方法。注意:好的繼承關(guān)係中,只有葉節(jié)點是具體類,其他節(jié)點應該都是抽象類,也就是說具體類別是不被繼承的。將盡可能多的共同程式碼放到抽象類別中。 7 迪米特法則最少知識原則。不要和陌生人說話。
本設計模式教學手冊涵蓋的內(nèi)容
本設計模式教學涵蓋所有設計模式介紹,包含了工廠模式(Factory Pattern)、抽象工廠模式(Abstract Factory Pattern)、單例模式(Singleton Pattern)、建造者模式(Builder Pattern)、原型模式(Prototype Pattern)等等。
提示:本教學的每一章都包含了許多Java實例,透過這些範例將幫助您更好地學習理解設計模式。
最新章節(jié)
- 傳輸對象模式 2016-10-18
- 服務定位器模式 2016-10-18
- 攔截過濾器模式 2016-10-18
- 前端控制器模式 2016-10-18
- 數(shù)據(jù)訪問對象模式 2016-10-18
- 組合實體模式 2016-10-18
- 業(yè)務代表模式 2016-10-18
- MVC 模式 2016-10-18
相關(guān)課程
- 電腦網(wǎng)路知識集合 2022-09-30
- 布爾教育HTTP協(xié)議視頻教程 2022-04-14
- 布爾教育正規(guī)表達式視頻教程 2022-04-18
- 布林教育設計模式影片教學 2022-04-21
- 電腦網(wǎng)路概述—程式設計師必須掌握的基礎(chǔ)知識 2021-11-22
- 程式設計師入門必備教學—HTTP協(xié)定詳解 2021-11-19
- 一小時全面入門HTTP協(xié)定—web開發(fā)必備 2021-11-26
- 90分鐘搞定Web基礎(chǔ)(網(wǎng)路協(xié)定|HTTP|Web伺服器) 2021-12-10