亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式六大原則(PHP)

bluesky / 2400人閱讀

摘要:常用的六大設(shè)計(jì)模式有單一職責(zé)原則,里氏替換原則,依賴倒轉(zhuǎn)原則,接口隔離原則,迪米特法則,開(kāi)閉原則。這六大原則是最虛,最抽象的,很難理解。這就是接口隔離原則。當(dāng)我們遵循前面介紹的五大原則,以及使用種設(shè)計(jì)模式的目的就是遵循開(kāi)閉原則。

  設(shè)計(jì)模式的目的是為了更好的代碼重用性,可讀性,可靠性和可維護(hù)性。常用的六大設(shè)計(jì)模式有:?jiǎn)我宦氊?zé)原則(SRP),里氏替換原則(LSP),依賴倒轉(zhuǎn)原則(DIP),接口隔離原則(ISP),迪米特法則(LOD),開(kāi)閉原則(OCP)。


1.單一職責(zé)原則(Single Responsibility Principle) 該原則是針對(duì)類來(lái)說(shuō)的,即一個(gè)類應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)。假設(shè)有一個(gè)部門的類叫做T,他的下面有兩個(gè)職責(zé)的方法叫做P1,P2。假如P1的職責(zé)發(fā)生改變時(shí)去修改這個(gè)部門類T,那么有可能造成職責(zé)P2發(fā)生故障。 舉個(gè)栗子: 我們用動(dòng)物呼吸的場(chǎng)景來(lái)表現(xiàn)一下 輸出結(jié)果: 但是呢,我們發(fā)現(xiàn)并不是所有的動(dòng)物都是呼吸空氣的,比如說(shuō)魚(yú)它是呼吸水的。根據(jù)SRP原則,我們應(yīng)該將Animal類分為陸地動(dòng)物和海洋生物,如下所示: 但是我們發(fā)現(xiàn)這樣修改花銷很大,既要將原來(lái)的類分解,又要修改客戶端。而直接修改Animal類則違背了單一職責(zé)原則,但花銷很小 如下所示: 這種修改方式?jīng)]有改變?cè)瓉?lái)的方法,而是在類中新加了一個(gè)方法,這樣雖然違反了單一職責(zé)原則,但是在方法級(jí)別上卻是符合單一職責(zé)原則的。在實(shí)際的編程中,只有邏輯足夠簡(jiǎn)單,才可能在代碼級(jí)違反單一職責(zé)原則;只有類中的方法數(shù)量足夠少,才可以在方法級(jí)別上違反單一職責(zé)原則。 遵循單一職責(zé)的優(yōu)點(diǎn): (1)降低類的復(fù)雜度,一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。 (2)提高類的可讀性,可維護(hù)性。 (1)降低變更引起的風(fēng)險(xiǎn)。


2.里氏替換原則(Liskov Substitution Principle) 該原則提出,如果對(duì)每個(gè)類型為T1的對(duì)象o1,都有類型為T2的對(duì)象o2,使得以T1定義的所有程序P在所有的對(duì)象o1都代換成o2時(shí),程序P的行為沒(méi)有發(fā)生變化,那么類型T2是類型T1的子類型。這話原句,不知道是翻譯的鍋還是咋地,看起來(lái)就晦澀難懂。其實(shí)可以簡(jiǎn)單地理解為所有引用基類的地方必須能夠透明的使用其子類的對(duì)象,在子類中盡量不要重寫(xiě)和重載父類的方法。 繼承作為面向?qū)ο蟮娜筇匦灾?,在給程序帶來(lái)巨大便利的同時(shí),也帶來(lái)了弊端。比如繼承會(huì)給程序帶來(lái)可入侵行,程序的可移植性降低,增加了對(duì)象間的耦合性。如果一個(gè)類被其他類所繼承,那么這個(gè)類在被修改的時(shí)候,必須考慮到所有的子類。并且父類在修改后,所以涉及到子類的功能都有可能發(fā)生故障。 舉個(gè)栗子: 運(yùn)行結(jié)果: 后來(lái)呢,我們想做個(gè)功能,將兩個(gè)數(shù)相加并且乘以100.這個(gè)時(shí)候我們看到上面那個(gè)類也是兩個(gè)參數(shù),只不過(guò)是相減。我們繼承一下A重寫(xiě)下那個(gè)方法不就完成求和再求積嗎?代碼如下: 運(yùn)行結(jié)果: 結(jié)果我們發(fā)現(xiàn),在業(yè)務(wù)邏輯代碼沒(méi)變的情況下結(jié)果居然跟預(yù)期的結(jié)果不一樣了。因?yàn)镃類雖然繼承了A類,但是它重寫(xiě)了A類的subtract方法,造成了原有功能的錯(cuò)誤。在實(shí)際的編碼過(guò)程中我們通常會(huì)重寫(xiě)父類的方法來(lái)完成新的功能,但是這樣會(huì)使得類的繼承體系復(fù)用性特別差。這個(gè)時(shí)候我們可以選擇讓A和C共同繼承一個(gè)更通俗的基類,然后實(shí)現(xiàn)他的方法,去掉A和C的繼承關(guān)系,采用依賴、聚合、組合等關(guān)系代替。舉個(gè)栗子:

這樣我們既可以保持原有的業(yè)務(wù)關(guān)系,又可以實(shí)現(xiàn)更多的功能。 3.依賴倒轉(zhuǎn)原則(Dependence Inversion Principle) 依賴倒置規(guī)定:高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。因?yàn)橄鄬?duì)于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多。以抽象為基礎(chǔ)搭建的架構(gòu)要比以細(xì)節(jié)為基礎(chǔ)的架構(gòu)要穩(wěn)定的多。依賴倒置的中心思想是面向接口編程。上層模塊不應(yīng)該依賴于下層模塊,應(yīng)該依賴于接口。從而使得下層模塊依賴于上層的接口,降低耦合度,提高系統(tǒng)的彈性。這六大原則是最虛,最抽象的,很難理解。舉個(gè)栗子說(shuō)明:

但是如果我們讀的是報(bào)紙,雜志呢,發(fā)現(xiàn)book并不適用了。我們引入一個(gè)抽象的接口IReader,代表讀物。讓Mother類與接口IReader發(fā)生依賴關(guān)系,而B(niǎo)ook和Newspaper都屬于讀物的范疇,讓他們各自都去實(shí)現(xiàn)IReader接口,這樣就符合高層不應(yīng)該依賴低層,應(yīng)該依賴于接口的依賴倒置原則,修改后代碼如下:

用了依賴倒置原則之后會(huì)發(fā)現(xiàn)帶給我們極大的便利,比如例子,一開(kāi)始Mother類與Book類耦合,如果要修改讀物的話,必須要?jiǎng)?chuàng)建一個(gè)新的讀物類,然后修改Mother類中傳入的類名,非常的麻煩。而修改后Mother類則直接依賴了IReader接口,這樣與Book解耦,每次只需要?jiǎng)?chuàng)建一個(gè)新的讀物類實(shí)現(xiàn)IReader接口即可調(diào)用 依賴關(guān)系的傳遞有三種辦法,分別是接口傳遞、構(gòu)造方法傳遞以及setter方法傳遞。 1.接口傳遞 2.構(gòu)造方法傳入(常用) 3.setter方法傳遞 在實(shí)際的編程中盡量注意以下三點(diǎn):1.低層模塊盡量都要有抽象類或者接口類,或者兩者都有2.變量的聲明類型盡量是抽象類或者接口(這里是指?jìng)魅氲哪莻€(gè)變量代表的類)3.遵循里氏替換原則。控制反轉(zhuǎn)(IOC)和依賴注入(DI)也是基于此原則,把所有類的實(shí)例化放在了一個(gè)容器中,從容器中獲取調(diào)用,降低了高層類對(duì)低層類的依賴。有學(xué)習(xí)IOC和DI的,可以留個(gè)郵箱,我會(huì)把一些理解的例子發(fā)一下。 4.接口隔離原則(InterfaceSegregation Principles) 一個(gè)類不應(yīng)該依賴他不需要的接口;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小接口上。比如類A通過(guò)接口E依賴類B,類C通過(guò)接口E依賴類D,如果接口E對(duì)于類A和類C來(lái)說(shuō)不是最小接口的話,則類B和類D必須去實(shí)現(xiàn)他們不需要的方法。這個(gè)時(shí)候我們將臃腫的接口拆分成獨(dú)立的幾個(gè)接口,類A和類C分別與他們需要的接口建立依賴關(guān)系。這就是接口隔離原則。舉個(gè)栗子:



可以看出,接口中出現(xiàn)的方法,不管對(duì)依賴于它的類有沒(méi)有作用,實(shí)現(xiàn)類都必須實(shí)現(xiàn)這些方法。這個(gè)時(shí)候我們把接口拆分下,實(shí)現(xiàn)接口隔離原則。舉個(gè)栗子:

看到這里,大家可能會(huì)覺(jué)得接口隔離原則和單一職責(zé)原則很相似。其實(shí)不是的,1.單一職責(zé)原則是注重的這個(gè)類的職責(zé),而接口隔離原則注重對(duì)接口依賴的隔離2.單一職責(zé)約束的是類,其次是方法,針對(duì)的是程序中的實(shí)現(xiàn)和細(xì)節(jié),而接口隔離原則約束的是接口,是抽象,是程序框架整體的構(gòu)建。 5.迪米特原則(Law of Demeter,也稱為最少知識(shí)原則Least Knowledge Principle) 一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解。類與類之間的關(guān)系越密切,耦合度越大。迪米特原則又叫最少知道原則,即一個(gè)類對(duì)自己依賴的類知道的越少越好。也就是說(shuō),無(wú)論被依賴的類多么復(fù)雜,都盡量將邏輯封裝在類的內(nèi)部。對(duì)外只提供public方法,而不對(duì)外泄露任何信息。迪米特原則還有個(gè)更簡(jiǎn)單的定義:只與直接的朋友通信。什么是直接的朋友:每個(gè)對(duì)象都會(huì)與其他對(duì)象有耦合關(guān)系,只要兩個(gè)對(duì)象之間有耦合關(guān)系,我們就稱這兩個(gè)對(duì)象之間是朋友關(guān)系。耦合的方式很多,依賴,關(guān)聯(lián),組合,聚合等。其中,我們稱出現(xiàn)成員變量,方法參數(shù),方法返回值中的類為直接的朋友,而出現(xiàn)在局部變量中的類不是直接的朋友。也就是說(shuō),陌生的類最好不要以局部變量的形式出現(xiàn)在類的內(nèi)部。舉個(gè)栗子: 這個(gè)設(shè)計(jì)的問(wèn)題在于CompanyManager中,SubCompanyManager類并不是它的直接朋友。按照迪米特法則,應(yīng)該避免類中出現(xiàn)這樣非直接朋友關(guān)系的耦合。修改如下 迪米特法則降低類之間的耦合,讓每個(gè)類都減少了不必要的依賴;但是過(guò)度使用迪米特法則會(huì)產(chǎn)生大量的中介類和傳遞類,導(dǎo)致系統(tǒng)復(fù)雜度變大。所以在采用迪米特法則的時(shí)候要反復(fù)權(quán)衡,既要做到結(jié)構(gòu)清晰,同時(shí)做到高內(nèi)聚低耦合。 開(kāi)閉原則(Open Close Principle) 一個(gè) 軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。當(dāng)軟件需要變化時(shí),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改已有的代碼來(lái)實(shí)現(xiàn)變化。當(dāng)我們遵循前面介紹的五大原則,以及使用23種設(shè)計(jì)模式的目的就是遵循開(kāi)閉原則。簡(jiǎn)單的理解就是構(gòu)建框架的時(shí)候要保持足夠的擴(kuò)展性,通擴(kuò)展來(lái)實(shí)現(xiàn)修改代碼而不是直接修改代碼。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/28782.html

相關(guān)文章

  • JAVA六大設(shè)計(jì)原則

    摘要:設(shè)計(jì)模式提供六個(gè)基本原則,分別是開(kāi)閉原則單一職責(zé)原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開(kāi)閉原則對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉??偨Y(jié)六大設(shè)計(jì)原則是代碼設(shè)計(jì)的基本原則。 JAVA設(shè)計(jì)模式提供六個(gè)基本原則,分別是: 開(kāi)閉原則(OCP) - The Open-Closed Principle 單一職責(zé)原則(SRP) - Single Responsibility Principle 里氏...

    Betta 評(píng)論0 收藏0
  • 【收藏篇】32篇技術(shù)博文匯總(九月總結(jié))

    摘要:首先先祝大家國(guó)慶節(jié)快樂(lè)今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫(xiě)更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語(yǔ)音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫(huà)跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...

    whlong 評(píng)論0 收藏0
  • 【收藏篇】32篇技術(shù)博文匯總(九月總結(jié))

    摘要:首先先祝大家國(guó)慶節(jié)快樂(lè)今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫(xiě)更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語(yǔ)音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫(huà)跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...

    Eric 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<