設(shè)計(jì)模式(1)—什么是設(shè)計(jì)模式?設(shè)計(jì)模式的六大原則是什么?

只有登上山頂,才能看到那邊的風(fēng)光

目錄

1.什么設(shè)計(jì)模式

2.設(shè)計(jì)模式的發(fā)展

3.設(shè)計(jì)原則6大原則

3.1 開閉原則

3.2? 里氏轉(zhuǎn)換原則

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

3.4? 接口隔離原則

3.5 合成/聚合復(fù)用原則?

3.6 迪米特原則

1.什么設(shè)計(jì)模式

軟件設(shè)計(jì)模式(Design pattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。設(shè)計(jì)模式使代碼開發(fā)真正工程化;設(shè)計(jì)模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。只有夯實(shí)地基搭好結(jié)構(gòu),才能蓋好堅(jiān)壯的大樓。也是我們邁向高級(jí)開發(fā)人員必經(jīng)的一步。即12字真言:設(shè)計(jì)模式是設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)

2.設(shè)計(jì)模式的發(fā)展

說起設(shè)計(jì)模式的發(fā)展,還要從四個(gè)男人的故事(注意此處沒有女人)開始說起,這四個(gè)男人分別是 Erich Gamma, Richard Helm,Ralph Johnson,和John Vlissides,他們是軟件設(shè)計(jì)領(lǐng)域的四位世界頂級(jí)大師,那軟件設(shè)計(jì)水平真是不知道高到哪里去了,反正我是自愧不如。這四位大佬合著了一本書《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》, 提出了23種基本設(shè)計(jì)模式,從理論高度提煉并規(guī)范了設(shè)計(jì)模式,對(duì)面向?qū)ο笤O(shè)計(jì),軟件復(fù)用領(lǐng)域產(chǎn)生了巨大影響。現(xiàn)在設(shè)計(jì)模式已經(jīng)被應(yīng)用到各種各樣的編程語言中,不管是后端的Java,C#還是前端的JavaScript, 你都能看到它的身影,設(shè)計(jì)模式最大的魅力在于,不管在那種編程語言中,它思想和表現(xiàn)都是一樣的,只是代碼語法略有不同而已。

3.設(shè)計(jì)模式6大原則

設(shè)計(jì)模式存在的根本原因是為了更好地復(fù)用代碼,增加代碼可維護(hù)性。

所以有如下6大原則:

?3.1 開閉原則

?對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,?即在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,只能增加新的代碼。

這樣的例子在我們的生活中隨處可見,比如在各種選秀比賽里,如果兩個(gè)選手在比賽中打成了平手,我們不可能說通過穿越到過去,去改變過去的結(jié)果,讓他們不打成平手,這是不可能實(shí)現(xiàn)的。但是我們可以通過添加附加的比賽,決定他們的勝負(fù)。即已經(jīng)發(fā)生的已經(jīng)不可以改變 ,我們只能改變那些事情對(duì)現(xiàn)在的影響。

3.2? 里氏轉(zhuǎn)換原則

子類繼承父類,任何基類出現(xiàn)的地方,一定可以用子類替代出現(xiàn)。

這怎么理解呢?比如說你的朋友u盤A中有一些小電影,一天你們像往常一樣,把u盤A插入電腦準(zhǔn)備一起欣賞小電影,卻發(fā)現(xiàn)u盤A壞了。這給正在興致勃勃的你們頓時(shí)澆了一盆涼水,這時(shí)候你靈機(jī)一動(dòng)說,幸好老子有備份。原來之前你已經(jīng)把朋友u盤A中的小電影復(fù)制到了你的 u盤B中,而且你的u盤B中除了從朋友哪兒復(fù)制的小電影,還有一些其它不可描述的內(nèi)容,這時(shí)候你有點(diǎn)猶豫要不要用自己的U盤B,看著正在興頭上的朋友,你一咬牙一跺腳說算了,不管那么多了,淦。于是你拔下朋友的u盤A插入自己的u盤B,順利打開電影,于是你們又興致勃勃的觀看起來。即子類是對(duì)父類的完全復(fù)制,父類可以被子類完全替代,子類可以增加新的內(nèi)容,而且不影響父類。

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

?引用一個(gè)對(duì)象,如果這個(gè)對(duì)象有底層類型,直接引用底層類型。

說到這里不得不吐槽一些博客的博主,好歹也是寫代碼的,寫博客的時(shí)候真沒有一點(diǎn)設(shè)計(jì)模式的原則。前幾天在網(wǎng)上搜一個(gè)問題,打開一看給我貼了一個(gè)另外博客的鏈接,打開這個(gè)鏈接之后又貼了另外一個(gè)博客的鏈接。。。。。。,你引用別人的博客我不反對(duì),你這引用引用的博客就過分了吧。? 總結(jié)一句話:引用的時(shí)候禁止套娃,直接引用最底層的類型

3.4? 接口隔離原則

使用多個(gè)隔離的接口,比使用單個(gè)接口要好,每一個(gè)接口應(yīng)該是一種角色。

比如我們的電腦上有多種不同類型的接口,像USB接口,電源接口,高清輸出接口等等,它們各自有著不同的功能,那么為什么不用一個(gè)接口完成所有的功能呢,這是因?yàn)椴煌脑O(shè)備,有不同的數(shù)據(jù)規(guī)格,而且數(shù)據(jù)帶寬需求也是是不同的,讓他們都使用同一個(gè)接口是不科學(xué)的,這從usb與hdmi設(shè)備的使用環(huán)境就能看出來差別。但你也不能每個(gè)設(shè)備都分一個(gè)接口,這是不現(xiàn)實(shí)的,應(yīng)該把統(tǒng)一數(shù)據(jù)規(guī)格的設(shè)備分為一個(gè)接口,例如USB接口可以同時(shí)支持,鼠標(biāo)鍵盤和U盤。即使用多個(gè)接口,比使用單個(gè)接口要好,但是小得要有限度。

3.5 ?合成/聚合復(fù)用原則?

新的對(duì)象應(yīng)使用一些已有的對(duì)象,使之成為新對(duì)象的一部分。

舉個(gè)例子:周末天氣晴朗,你和好朋友約好一起去爬山(不是張東升的那種爬山),這時(shí)候就需要有一個(gè)相機(jī),但是不巧的是你的相機(jī)壞了,于是你就拿著相機(jī)來到了修理店。老板告訴你有一個(gè)零件壞了,問你是要更換零件,還是再買一個(gè)新的呢?你心里MMP了一句對(duì)老板說,當(dāng)然是更換零件了,我這相機(jī)才買沒多久還新著呢。即用已經(jīng)有的東西合成新的東西,使原來的東西成為新東西的一部分。

3.6 迪米特原則

?一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)獨(dú)立,即一個(gè)對(duì)象應(yīng)對(duì)其他對(duì)象有盡可能少的了解。

這里的對(duì)象可以理解為對(duì)象(女朋友),假如你是一個(gè)時(shí)間管理大師,同時(shí)交往了多個(gè)對(duì)象,當(dāng)然由于身經(jīng)百戰(zhàn),你對(duì)這些對(duì)象應(yīng)付自如,不像我們這些老實(shí)人,一個(gè)都應(yīng)付不來。但是這是你的小秘密,為了不讓她們發(fā)現(xiàn)這個(gè)秘密,你就應(yīng)該使這些對(duì)象之間應(yīng)該盡可能少的了解,甚至完全不了解,如果她們之間了解過多,在相互八卦或者看朋友圈的時(shí)候,發(fā)現(xiàn)了你的這個(gè)小秘密,那可是要出大事情的(喜歡多人運(yùn)動(dòng)的除外)。即多個(gè)對(duì)象之間應(yīng)該盡量避免有任何關(guān)聯(lián)。

本文只對(duì)設(shè)計(jì)模式進(jìn)行了簡(jiǎn)單的介紹,有些例子可能也不太合適。如果想對(duì)設(shè)計(jì)模式有更多的了解,推薦看上文中四位大佬的那本書:《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》。

原創(chuàng)不易,如果覺得不錯(cuò)的話歡迎關(guān)注,轉(zhuǎn)發(fā),感謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容