亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

設(shè)計(jì)模式

閱讀(22392) 更新時(shí)間(2022-04-13)

設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)模式使代碼編寫(xiě)真正工程化;設(shè)計(jì)模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。


設(shè)計(jì)模式(英語(yǔ) design pattern)是對(duì)面向?qū)ο笤O(shè)計(jì)中反復(fù)出現(xiàn)的問(wèn)題的解決方案。這個(gè)術(shù)語(yǔ)是在1990年代由Erich Gamma等人從建筑設(shè)計(jì)領(lǐng)域引入到計(jì)算機(jī)科學(xué)中來(lái)的。這個(gè)術(shù)語(yǔ)的含義還存有爭(zhēng)議。算法不是設(shè)計(jì)模式,因?yàn)樗惴ㄖ铝τ诮鉀Q問(wèn)題而非設(shè)計(jì)問(wèn)題。設(shè)計(jì)模式通常描述了一組相互緊密作用的類與對(duì)象。設(shè)計(jì)模式提供一種討論軟件設(shè)計(jì)的公共語(yǔ)言,使得熟練設(shè)計(jì)者的設(shè)計(jì)經(jīng)驗(yàn)可以被初學(xué)者和其他設(shè)計(jì)者掌握。設(shè)計(jì)模式還為軟件重構(gòu)提供了目標(biāo)。

隨著軟件開(kāi)發(fā)社群對(duì)設(shè)計(jì)模式的興趣日益增長(zhǎng),已經(jīng)出版了一些相關(guān)的專著,定期召開(kāi)相應(yīng)的研討會(huì),而且Ward Cunningham為此發(fā)明了WikiWiki用來(lái)交流設(shè)計(jì)模式的經(jīng)驗(yàn)。

提示:本教程將通過(guò)?Java?實(shí)例,一步一步向您講解設(shè)計(jì)模式的概念。所以你需要對(duì)Java知識(shí)有所了解。

表述格式

表述一個(gè)軟件設(shè)計(jì)模式的格式根據(jù)作者的不同,劃分和名稱等都會(huì)有所不同。常用的GoF描述模式的格式大致分為以下這些部分:

  • 模式名:每一個(gè)模式都有自己的名字,模式的名字使得我們可以討論我們的設(shè)計(jì)。

  • 問(wèn)題:在面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)過(guò)程中反復(fù)出現(xiàn)的特定場(chǎng)合,它導(dǎo)致我們采用某個(gè)模式。

  • 解決方案:上述問(wèn)題的解決方案,其內(nèi)容給出了設(shè)計(jì)的各個(gè)組成部分,它們之間的關(guān)系、職責(zé)劃分和協(xié)作方式。

  • 別名:一個(gè)模式可以有超過(guò)一個(gè)以上的名稱。這些名稱應(yīng)該要在這一節(jié)注明。

  • 動(dòng)機(jī):在哪種情況使用該模式,是本節(jié)提供的方案(包括問(wèn)題與來(lái)龍去脈)的責(zé)任。

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

  • 結(jié)構(gòu):這部分常用類圖與交互圖闡述此模式。

  • 參與者:這部分提供一份本模式用到的類與對(duì)象清單,與它們?cè)谠O(shè)計(jì)下扮演的角色。

  • 合作:描述在此模式下,類與對(duì)象間的交互。

  • 影響:采用該模式對(duì)軟件系統(tǒng)其他部分的影響,比如對(duì)系統(tǒng)的擴(kuò)充性、可移植性的影響。影響也包括負(fù)面的影響。這部分應(yīng)描述使用本模式后的結(jié)果、副作用、與權(quán)衡(trade-off)

  • 實(shí)現(xiàn):這部分應(yīng)描述實(shí)現(xiàn)該模式、該模式的部分方案、實(shí)現(xiàn)該模式的可能技術(shù)、或者建議實(shí)現(xiàn)模式的方法。

  • 示例:簡(jiǎn)略描繪出如何以編程語(yǔ)言來(lái)使用模式。

  • 已知應(yīng)用:業(yè)界已知的實(shí)現(xiàn)示例。

  • 相關(guān)模式:這部分包括其他相關(guān)模式,以及與其他類似模式的不同。

提示:我們的《設(shè)計(jì)模式》教程將幫助您學(xué)習(xí)所有設(shè)計(jì)模式知識(shí)。如果你有任何疑問(wèn),請(qǐng)前往PHP中文網(wǎng)社區(qū)提出你的問(wèn)題,會(huì)有熱心網(wǎng)友為你解答。

模式原則

大家都開(kāi)始注意設(shè)計(jì)模式。那么,到底我們?yōu)槭裁匆迷O(shè)計(jì)模式呢?這么多設(shè)計(jì)模式為什么要怎么設(shè)計(jì)呢?

說(shuō)實(shí)話,以前我還真沒(méi)搞清楚。就是看大家一口一個(gè)"Design pattern",心就有點(diǎn)發(fā)虛。于是就買(mǎi)了本"四人幫"的設(shè)計(jì)模式,結(jié)果看得似懂非懂:看得時(shí)候好像是懂了,過(guò)一會(huì)就忘了。可能是本人比較"愚鈍"吧:))最近,有了點(diǎn)感悟。"獨(dú)樂(lè)不如眾樂(lè)",與大家分享一下,還望指教!?

為什么要提倡"Design Pattern"呢?根本原因是為了代碼復(fù)用,增加可維護(hù)性。

那么怎么才能實(shí)現(xiàn)代碼復(fù)用呢?OO界有前輩的幾個(gè)原則:"開(kāi)-閉"原則(Open Closed Principal)、里氏代換原則、合成復(fù)用原則。設(shè)計(jì)模式就是實(shí)現(xiàn)了這些原則,從而達(dá)到了代碼復(fù)用、增加可維護(hù)性的目的。

  • 開(kāi)-閉原則

此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是說(shuō)模塊應(yīng)對(duì)擴(kuò)展開(kāi)放,而對(duì)修改關(guān)閉。模塊應(yīng)盡量在不修改原(是"原",指原來(lái)的代碼)代碼的情況下進(jìn)行擴(kuò)展。那么怎么擴(kuò)展呢?我們看工廠模式"factory pattern":假設(shè)中關(guān)村有一個(gè)賣盜版盤(pán)和毛片的小子,我們給他設(shè)計(jì)一"光盤(pán)銷售管理軟件"。我們應(yīng)該先設(shè)計(jì)一"光盤(pán)"接口。如圖:【pre】______________|<>|| 光盤(pán) ||_____________|| 賣() || ||_____________|【/pre】而盜版盤(pán)和毛片是其子類。小子通過(guò)"DiscFactory"來(lái)管理這些光盤(pán)。代碼為:

publicclassDiscFactory{
publicstatic光盤(pán)
getDisc(Stringname){
return(光盤(pán))Class.forName(name).getInstance();
}
}

有人要買(mǎi)盜版盤(pán),怎么實(shí)現(xiàn)呢?

public class 小子{ public static void main(String【】 args){ 光盤(pán) d=DiscFactory.getDisc("盜版盤(pán)"); 光盤(pán).賣(); } }

如果有一天,這小子良心發(fā)現(xiàn)了,開(kāi)始賣正版軟件。沒(méi)關(guān)系,我們只要再創(chuàng)建一個(gè)"光盤(pán)"的子類"正版軟件"就可以了。不需要修改原結(jié)構(gòu)和代碼。怎么樣?對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。"開(kāi)-閉原則" 工廠模式是對(duì)具體產(chǎn)品進(jìn)行擴(kuò)展,有的項(xiàng)目可能需要更多的擴(kuò)展性,要對(duì)這個(gè)"工廠"也進(jìn)行擴(kuò)展,那就成了"抽象工廠模式"。

  • 里氏代換原則

里氏代換原則是由"Barbara Liskov"提出的。如果調(diào)用的是父類的話,那么換成子類也完全可以運(yùn)行。比如: 光盤(pán) d=new 盜版盤(pán)(); d.賣(); 要將"盜版盤(pán)"類改為"毛片"類,沒(méi)問(wèn)題,完全可以運(yùn)行。Java編譯程序會(huì)檢查程序是否符合里氏代換原則。還記得java繼承的一個(gè)原則嗎?子類override方法的訪問(wèn)權(quán)限不能小于父類對(duì)應(yīng)方法的訪問(wèn)權(quán)限。比如"光盤(pán)"中的方法"賣"訪問(wèn)權(quán)限是"public",那么"盜版盤(pán)"和"毛片"中的"賣"方法就不能是protected或private,編譯不能通過(guò)。為什么要這樣呢?你想?。喝绻?盜版盤(pán)"的"賣"方法是private。那么下面這段代碼就不能執(zhí)行了: 光盤(pán) d=new 盜版盤(pán)(); d.賣();可以說(shuō):里氏代換原則是繼承復(fù)用的一個(gè)基礎(chǔ)。

  • 合成復(fù)用原則

就是說(shuō)要少用繼承,多用合成關(guān)系來(lái)實(shí)現(xiàn)。我曾經(jīng)這樣寫(xiě)過(guò)程序:有幾個(gè)類要與數(shù)據(jù)庫(kù)打交道,就寫(xiě)了一個(gè)數(shù)據(jù)庫(kù)操作的類,然后別的跟數(shù)據(jù)庫(kù)打交道的類都繼承這個(gè)。結(jié)果后來(lái),我修改了數(shù)據(jù)庫(kù)操作類的一個(gè)方法,各個(gè)類都需要改動(dòng)。"牽一發(fā)而動(dòng)全身"!面向?qū)ο笫且巡▌?dòng)限制在盡量小的范圍。

在Java中,應(yīng)盡量針對(duì)Interface編程,而非實(shí)現(xiàn)類。這樣,更換子類不會(huì)影響調(diào)用它方法的代碼。要讓各個(gè)類盡可能少的跟別人聯(lián)系,"不要與陌生人說(shuō)話"。這樣,城門(mén)失火,才不至于殃及池魚(yú)。擴(kuò)展性和維護(hù)性才能提高

理解了這些原則,再看設(shè)計(jì)模式,只是在具體問(wèn)題上怎么實(shí)現(xiàn)這些原則而已。張無(wú)忌學(xué)太極拳,忘記了所有招式,打倒了"玄冪二老",所謂"心中無(wú)招"。設(shè)計(jì)模式可謂招數(shù),如果先學(xué)通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑!(JR)

依賴倒轉(zhuǎn)原則抽象不應(yīng)該依賴與細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依

  • 依賴倒轉(zhuǎn)原則

要針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。傳遞參數(shù),或者在組合聚合關(guān)系中,盡量引用層次高的類。主要是在構(gòu)造對(duì)象時(shí)可以動(dòng)態(tài)的創(chuàng)建各種具體對(duì)象,當(dāng)然如果一些具體類比較穩(wěn)定,就不必在弄一個(gè)抽象類做它的父類,這樣有畫(huà)舌添足的感覺(jué)接口隔離原則定制服務(wù)的例子,每一

  • 接口隔離原則

一種角色,不多不少,不干不該干的事,該干的事都要干 抽象類抽象類不會(huì)有實(shí)例

  • 抽象類

類為子類繼承,一般包含這個(gè)系的共同屬性和方法。注意:好的繼承關(guān)系中,只有葉節(jié)點(diǎn)是具體類,其他節(jié)點(diǎn)應(yīng)該都是抽象類,也就是說(shuō)具體類是不被繼承的。將盡可能多的共同代碼放到抽象類中。 7 迪米特法則最少知識(shí)原則。不要和陌生人說(shuō)話。

本設(shè)計(jì)模式教程手冊(cè)涵蓋的內(nèi)容

本設(shè)計(jì)模式教程涵蓋所有設(shè)計(jì)模式介紹,包含了工廠模式(Factory Pattern)、抽象工廠模式(Abstract Factory Pattern)、單例模式(Singleton Pattern)、建造者模式(Builder Pattern)、原型模式(Prototype Pattern)等等。

提示:本教程的每一章都包含了很多Java實(shí)例,通過(guò)這些例子將幫助您更好地學(xué)習(xí)理解設(shè)計(jì)模式。