很多人對(duì)設(shè)計(jì)模式并不了解。其實(shí)設(shè)計(jì)模式是一組代碼設(shè)計(jì)經(jīng)驗(yàn),已經(jīng)被重復(fù)使用并且為大多數(shù)人所熟知。設(shè)計(jì)模式的使用是為了重用代碼,使其他人更容易理解代碼并確保代碼的可靠性。毫無疑問,設(shè)計(jì)模式對(duì)其他人和系統(tǒng)都是互惠互利的。設(shè)計(jì)模式使代碼編寫真正地工程化;設(shè)計(jì)模式是軟件工程的基石,就像建筑物的結(jié)構(gòu)一樣。那么設(shè)計(jì)模式有哪些原則?
里氏代換原則
里氏代換原則是由"BarbaraLiskov"提出的。如果調(diào)用的是父類的話,那么換成子類也完全可以運(yùn)行。比如:光盤d=new盜版盤();d.賣();要將"盜版盤"類改為"毛片"類,沒問題,完全可以運(yùn)行。Java編譯程序會(huì)檢查程序是否符合里氏代換原則。還記得java繼承的一個(gè)原則嗎?子類override方法的訪問權(quán)限不能小于父類對(duì)應(yīng)方法的訪問權(quán)限。比如"光盤"中的方法"賣"訪問權(quán)限是"public",那么"盜版盤"和"毛片"中的"賣"方法就不能是protected或private,編譯不能通過。為什么要這樣呢?你想啊:如果"盜版盤"的"賣"方法是private。那么下面這段代碼就不能執(zhí)行了:光盤d=new盜版盤();d.賣();可以說:里氏代換原則是繼承復(fù)用的一個(gè)基礎(chǔ)。
合成復(fù)用原則
就是說要少用繼承,多用合成關(guān)系來實(shí)現(xiàn)。我曾經(jīng)這樣寫過程序:有幾個(gè)類要與數(shù)據(jù)庫打交道,就寫了一個(gè)數(shù)據(jù)庫操作的類,然后別的跟數(shù)據(jù)庫打交道的類都繼承這個(gè)。結(jié)果后來,我修改了數(shù)據(jù)庫操作類的一個(gè)方法,各個(gè)類都需要改動(dòng)。"牽一發(fā)而動(dòng)全身"!面向?qū)ο笫且巡▌?dòng)限制在盡量小的范圍。
在Java中,應(yīng)盡量針對(duì)Interface編程,而非實(shí)現(xiàn)類。這樣,更換子類不會(huì)影響調(diào)用它方法的代碼。要讓各個(gè)類盡可能少的跟別人聯(lián)系,"不要與陌生人說話"。這樣,城門失火,才不至于殃及池魚。擴(kuò)展性和維護(hù)性才能提高。
理解了這些原則,再看設(shè)計(jì)模式,只是在具體問題上怎么實(shí)現(xiàn)這些原則而已。張無忌學(xué)太極拳,忘記了所有招式,打倒了"玄冪二老",所謂"心中無招"。設(shè)計(jì)模式可謂招數(shù),如果先學(xué)通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。
依賴倒轉(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è)抽象類做它的父類,這樣有畫舌添足的感覺接口隔離原則定制服務(wù)的例子。
接口隔離原則
一種角色,不多不少,不干不該干的事,該干的事都要干抽象類抽象類不會(huì)有實(shí)例
抽象類
類為子類繼承,一般包含這個(gè)系的共同屬性和方法。注意:好的繼承關(guān)系中,只有葉節(jié)點(diǎn)是具體類,其他節(jié)點(diǎn)應(yīng)該都是抽象類,也就是說具體類是不被繼承的。將盡可能多的共同代碼放到抽象類中。迪米特法則最少知識(shí)原則。不要和陌生人說話。
上述就是關(guān)于設(shè)計(jì)模式有哪些原則的全部?jī)?nèi)容,想了解更多關(guān)于設(shè)計(jì)模式的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。