设计模式之总体介绍
1.?背景與介紹
設(shè)計(jì)模式是經(jīng)過(guò)反復(fù)使用、經(jīng)過(guò)分類的代碼總結(jié)。設(shè)計(jì)模式的目的是提高代碼可重用性和可靠性,并使代碼條理清晰、易于理解、易于維護(hù)。
設(shè)計(jì)模式描述了在各種情況下,要選擇什么樣的方案來(lái)解決問(wèn)題。設(shè)計(jì)模式通常以類和對(duì)象來(lái)描述其中的關(guān)系和相互作用,換句話就是在設(shè)計(jì)模式里,這些類和普通的類沒(méi)有區(qū)別,只是它們的相互作用形成了各種設(shè)計(jì)模式,并解決了很多現(xiàn)實(shí)性的問(wèn)題。
設(shè)計(jì)模式能使不穩(wěn)定依賴于相對(duì)穩(wěn)定、具體依賴于相對(duì)抽象,避免會(huì)引起麻煩的緊耦合,以增強(qiáng)軟件設(shè)計(jì)面對(duì)并適應(yīng)變化的能力。
設(shè)計(jì)模式是對(duì)面向?qū)ο蟮慕^佳應(yīng)用,它提供了眾多不斷重復(fù)發(fā)生在我們周圍的問(wèn)題的解決方案。學(xué)習(xí)設(shè)計(jì)模式可以更好的理解面向?qū)ο蟮膬?nèi)容,同時(shí)面向?qū)ο笠矠樵O(shè)計(jì)模式提供了很好的理論基礎(chǔ),在學(xué)習(xí)的過(guò)程中,會(huì)接觸到很多面向?qū)ο蟮南嚓P(guān)應(yīng)用。
2.?設(shè)計(jì)原則
單一職責(zé)原則?(Single Responsiblity Principle SRP)
開閉原則(Open Closed Principle,OCP)
模塊應(yīng)對(duì)擴(kuò)展開放,而對(duì)修改關(guān)閉。直白點(diǎn)說(shuō)就是,模塊應(yīng)盡量在不修改原代碼的情況下進(jìn)行擴(kuò)展
里氏代換原則(Liskov Substitution Principle,LSP)
如果調(diào)用的是父類的話,那么換成子類也完全可以運(yùn)行
依賴倒轉(zhuǎn)原則(Dependency Inversion Principle,DIP)
把父類都替換成它的子類,而不會(huì)導(dǎo)致程序的行為發(fā)聲變化
接口隔離原則(Interface Segregation Principle,ISP)
合成/聚合復(fù)用原則(Composite/Aggregate Reuse Principle,CARP)
最小知識(shí)原則(Principle of Least Knowledge,PLK,也叫迪米特法則)
一個(gè)對(duì)象應(yīng)對(duì)其他對(duì)象有盡可能少的了解,也就是說(shuō)要做好信息的隱藏,這個(gè)原則可以更多的從封裝的角度去思考,包括方法與屬性的設(shè)計(jì)。
3.?分類
根據(jù)GOF《設(shè)計(jì)模式》一書,設(shè)計(jì)模式分為三個(gè)大類,共23種。
以下改編自維基百科,另外再附一張總覽圖,方便有個(gè)總體的概念
?
模式名稱 | 描述 |
創(chuàng)建型模式 | |
工廠方法模式 | 定義一個(gè)接口用于創(chuàng)建對(duì)象,但是讓子類決定初始化哪個(gè)類。工廠方法把一個(gè)類的初始化下放到子類。 |
抽象工廠模式 | 為一個(gè)產(chǎn)品族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品族的某一系列的時(shí)候,可以從抽象工廠中選出相應(yīng)的系列創(chuàng)建一個(gè)具體的工廠類。 |
單例模式 | 確保一個(gè)類只有一個(gè)實(shí)例,并提供對(duì)該實(shí)例的全局訪問(wèn)。 |
生成器模式 | 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 |
原型模式 | 用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型,創(chuàng)建新的對(duì)象。 |
結(jié)構(gòu)型模式 | |
適配器模式 | 將某個(gè)類的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口表示。適配器模式可以消除由于接口不匹配所造成的類兼容性問(wèn)題。 |
橋接模式 | 將一個(gè)抽象與實(shí)現(xiàn)解耦,以便兩者可以獨(dú)立的變化。 |
組合模式 | 把多個(gè)對(duì)象組成樹狀結(jié)構(gòu)來(lái)表示局部與整體,這樣用戶可以一樣的對(duì)待單個(gè)對(duì)象和對(duì)象的組合。 |
修飾模式 | 向某個(gè)對(duì)象動(dòng)態(tài)地添加更多的功能。修飾模式是除類繼承外另一種擴(kuò)展功能的方法。 |
外觀模式 | 為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, 外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。 |
享元模式 | 通過(guò)共享以便有效的支持大量小顆粒對(duì)象。 |
代理模式 | 為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。 |
行為型模式 | |
責(zé)任鏈模式 | 為解除請(qǐng)求的發(fā)送者和接收者之間耦合,而使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它。 |
命令模式 | 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。 |
解釋器模式 | 給定一個(gè)語(yǔ)言, 定義它的文法的一種表示,并定義一個(gè)解釋器, 該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。 |
迭代器模式 | 提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。 |
中介者模式 | 包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必相互明顯作用,從而使它們可以松散偶合。當(dāng)某些對(duì)象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用,保證這些作用可以彼此獨(dú)立的變化。 |
備忘錄模式 | 備忘錄對(duì)象是一個(gè)用來(lái)存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照的對(duì)象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并外部化,存儲(chǔ)起來(lái),從而可以在將來(lái)合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)起來(lái)的狀態(tài)。 |
觀察者模式 | 在對(duì)象間定義一個(gè)一對(duì)多的聯(lián)系性,由此當(dāng)一個(gè)對(duì)象改變了狀態(tài),所有其他相關(guān)的對(duì)象會(huì)被通知并且自動(dòng)刷新。 |
狀態(tài)模式 | 讓一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。狀態(tài)模式需要對(duì)每一個(gè)系統(tǒng)可能獲取的狀態(tài)創(chuàng)立一個(gè)狀態(tài)類的子類。當(dāng)系統(tǒng)的狀態(tài)變化時(shí),系統(tǒng)便改變所選的子類。 |
策略模式 | 定義一個(gè)算法的系列,將其各個(gè)分裝,并且使他們有交互性。策略模式使得算法在用戶使用的時(shí)候能獨(dú)立的改變。 |
模板方法模式 | 模板方法模式準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法及具體構(gòu)造子類的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。先構(gòu)建一個(gè)頂級(jí)邏輯框架,而將邏輯的細(xì)節(jié)留給具體的子類去實(shí)現(xiàn)。 |
訪問(wèn)者模式 | 封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改,接受這個(gè)操作的數(shù)據(jù)結(jié)構(gòu)可以保持不變。訪問(wèn)者模式適用于數(shù)據(jù)結(jié)構(gòu)相對(duì)未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合可以相對(duì)自由的演化。 |
總結(jié)
- 上一篇: 你可以保持沉默,但你所说的一切都将成为呈
- 下一篇: .NET Core 微服务之Polly熔