設(shè)計(jì)模式分類及設(shè)計(jì)原則

01?概述

????設(shè)計(jì)模式的基礎(chǔ)是:多態(tài)。

????學(xué)習(xí)設(shè)計(jì)模式將有助于更加深入地理解面向?qū)ο笏枷?,讓你知道?/p>

??? 1、如何將代碼分散在幾個(gè)不同的類中?

??? 2、為什么要有“接口”?

??? 3、何謂針對(duì)抽象編程?

??? 4、何時(shí)不應(yīng)該使用繼承?

??? 5、如何不修改源代碼增加新功能?

??? 6、更好地閱讀和理解現(xiàn)有類庫與其他系統(tǒng)中的源代碼。

? ??推薦書籍:

????《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》

????《大話設(shè)計(jì)模式》

02?分類

??? 1、從目的來看:

????創(chuàng)建型模式

????結(jié)構(gòu)型模式

????行為型模式

??? 2、從范圍來看:

????類模式處理類與子類的靜態(tài)關(guān)系

????對(duì)象模式處理對(duì)象間的動(dòng)態(tài)關(guān)系

??? 3、從封裝角度來看:

????組件協(xié)作:Template Method,Strategy,Observer/Event

????單一職責(zé):Decorator,Bridge

????對(duì)象創(chuàng)建:Factory Method,Abstract Factory,Prototype,Builder

????對(duì)象性能:Singleton,F(xiàn)lyweight

????接口隔離:Fa?ade,Proxy,Mediator,Adaptor

????狀態(tài)變化:Memento,State

????數(shù)據(jù)結(jié)構(gòu):Composite,Iterator,Chain of Responsibility

????行為變化:Command,Visitor

????領(lǐng)域問題:Interpreter

??? GoF提出的設(shè)計(jì)模型有23個(gè),包括:創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式。簡(jiǎn)單工廠模式不屬于GoF23種設(shè)計(jì)模式,因此設(shè)計(jì)模式目前分類:GoF的23種+簡(jiǎn)單工廠模式=24種。

2.1 創(chuàng)建型

????創(chuàng)建型(Creational)模式:如何創(chuàng)建對(duì)象。

2.2 結(jié)構(gòu)型

????結(jié)構(gòu)型(Structual)模式:如何實(shí)現(xiàn)類或?qū)ο蟮慕M合。

2.3 行為型

????行為型(Behaviioral)模式:類或?qū)ο笤鯓咏换ヒ约霸鯓臃峙渎氊?zé)。

03?面向?qū)ο?/b>

? ??從設(shè)計(jì)模式角度理解面向?qū)ο螅?/b>

??? 1、向下:面向?qū)ο笕髾C(jī)制

????封裝:隱藏內(nèi)部實(shí)現(xiàn)

????繼承:復(fù)用現(xiàn)有代碼

????多態(tài):改寫對(duì)象行為

??? 2、向上:深刻把握面向?qū)ο髾C(jī)制所帶來的的抽象意義,理解如何使用這些機(jī)制來表達(dá)現(xiàn)實(shí)世界,掌握什么是“好的面向?qū)ο笤O(shè)計(jì)”。

? ??如何解決復(fù)雜性?

????1、分解

????人們面對(duì)復(fù)雜性有一個(gè)常見的做法:即分而治之,將大問題分解為多個(gè)小問題,將復(fù)雜問題分解為多個(gè)簡(jiǎn)單問題。

????2、抽象

????更高層次來講,人們處理復(fù)雜性有一個(gè)通用的技術(shù),即抽象。由于不能掌握全部的復(fù)雜對(duì)象,我們選擇忽視它的非本質(zhì)細(xì)節(jié),而去處理泛化和理想化的對(duì)象模型。

04?設(shè)計(jì)原則

????對(duì)于面向?qū)ο筌浖到y(tǒng)的設(shè)計(jì)而言,在支持可維護(hù)性的同時(shí),提高系統(tǒng)的可復(fù)用性是一個(gè)至關(guān)重要的問題。如何同時(shí)提高一個(gè)軟件系統(tǒng)的可維護(hù)性和可復(fù)用性是面向?qū)ο笤O(shè)計(jì)需要解決的核心問題之一。

????設(shè)計(jì)原則最終目的:高內(nèi)聚,低耦合。

4.1 單一職責(zé)原則SRP

????單一職責(zé)原則(Single Responsibility Priciple,SRP):類的職責(zé)單一,對(duì)外只提供一種功能,引起類變化的原因應(yīng)該只有一個(gè)。

4.2 開放封閉原則OCP

????開閉原則(Open-Closed Priciple,OCP):對(duì)擴(kuò)展開放,對(duì)更改封閉,即類的改動(dòng)是通過增加代碼進(jìn)行的,而不是修改源代碼。

????類模塊應(yīng)該是可擴(kuò)展的,但是不可修改。

4.3 Liskov替換原則LSP

????里氏代換原則(Liskov Substitution Priciple,LSP):子類必須能夠替換它們的基本(is-a),即任何抽象類出現(xiàn)的地方都可以用他的實(shí)現(xiàn)類進(jìn)行替換,實(shí)際上就是虛擬機(jī)制,語言級(jí)別實(shí)現(xiàn)面向?qū)ο蠊δ堋?/p>

4.4 優(yōu)先使用對(duì)象組合,而不是類繼承

????類繼承通常為“白箱復(fù)用”,對(duì)象組合通常為“黑箱復(fù)用”。

????繼承在某種程度上破壞了封裝性,子類父類耦合度高。

????而對(duì)象組合則只要求被組合的對(duì)象具有良好定義的接口,耦合度低。

4.5 依賴倒置原則DIP

????依賴倒轉(zhuǎn)原則(Dependence Inversion Priciple,DIP):高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定)。

????抽象(穩(wěn)定)不應(yīng)該依賴于實(shí)現(xiàn)細(xì)節(jié)(變化),實(shí)現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象(穩(wěn)定)。即,依賴于抽象(接口),不要依賴具體的實(shí)現(xiàn)(類),也就是針對(duì)接口編程。

????注:之所以叫依賴倒置,是相對(duì)于原來的高層依賴底層,抽象依賴具體的“倒置”。

4.6 接口隔離原則ISP

????接口隔離原則(Interface Segregation Priciple,ISP):不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法,一個(gè)接口應(yīng)該只提供一種對(duì)外功能,不應(yīng)該把所有操作都封裝到一個(gè)接口中去。即接口應(yīng)該小而完備。

????注:?jiǎn)我宦氊?zé)原則說的是類,接口隔離原則說的是方法(接口)。

4.7 合成復(fù)用原則CRP

????合成復(fù)用原則(Composite Reuse Priciple,CRP):類繼承通常為“白箱復(fù)用”,對(duì)象組合通常為“黑箱復(fù)用”。

????如果使用繼承,會(huì)導(dǎo)致父類的任何交換都可能影響到子類的行為。繼承在某種程度上破壞了封裝性,子類父類耦合度高。而對(duì)象組合則只要求被組合的對(duì)象具有良好定義的接口,耦合度低。

????注:優(yōu)先使用對(duì)象組合,而不是類繼承。

4.8 封裝變化點(diǎn)

????使用封裝來創(chuàng)建對(duì)象之間的分界層,讓設(shè)計(jì)者可以在分界層的一側(cè)進(jìn)行修改,而不會(huì)對(duì)另一側(cè)產(chǎn)生不良的影響,從而實(shí)現(xiàn)層次間的松耦合。

4.9 迪米特法則LoD

????迪米特法則(Law of Demeter,LoD)/最少知識(shí)原則:一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象盡可能少的了解,從而降低各個(gè)對(duì)象之間的耦合,提高系統(tǒng)的可維護(hù)性。

????不將變量類型聲明為某個(gè)特定的具體類,而是聲明為某個(gè)接口??蛻舫绦驘o需獲知對(duì)象的具體類型,只需要知道對(duì)象所具有的接口。

????減少系統(tǒng)中各部分的依賴關(guān)系,從而實(shí)現(xiàn)“高內(nèi)聚、松耦合”的類型設(shè)計(jì)方案。

????注:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。

05?注意事項(xiàng)

????什么時(shí)候不用設(shè)計(jì)模式?

????1、代碼可讀性很差時(shí)

????2、需求理解還很淺時(shí)

????3、變化沒有顯現(xiàn)時(shí)

????4、不是系統(tǒng)的關(guān)鍵依賴點(diǎn)

????5、項(xiàng)目沒有復(fù)用價(jià)值時(shí)

????6、項(xiàng)目將要發(fā)布時(shí)

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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