設(shè)計(jì)模式有兩種分類方法讼油,即根據(jù)模式的目的來分和根據(jù)模式的作用的范圍來分霎迫。
一、根據(jù)目的來分温自;通過完成什么工作劃分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式?3 種類型
1皇钞、創(chuàng)建型模式:作用于對(duì)象的創(chuàng)建悼泌,將對(duì)象的創(chuàng)建與使用分離。其中囊括了單例夹界、原型馆里、工廠方法、抽象工廠、建造者5 種創(chuàng)建型模式鸠踪。
2丙者、結(jié)構(gòu)型模式:將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu),其中以代理营密、適配器械媒、橋接、裝飾评汰、外觀纷捞、享元、組合 7 種結(jié)構(gòu)型模式為主被去。
3主儡、行為型模式:作用于類或?qū)ο笾g相互協(xié)作共同完成單個(gè)對(duì)象無法單獨(dú)完成的任務(wù),以及怎樣分配職責(zé)惨缆。主要包含了模板方法糜值、策略、命令坯墨、職責(zé)鏈寂汇、狀態(tài)、觀察?
? ? ? ? ? ?? 者畅蹂、中介者健无、迭代器、訪問者液斜、備忘錄累贤、解釋器等 11 種行為型模式。
二少漆、根據(jù)作用范圍來分臼膏;根據(jù)是用于類上還是用于對(duì)象上劃分分為類模式和對(duì)象模式兩種。
1示损、類模式:用于處理類與子類之間的關(guān)系渗磅,這些關(guān)系通過繼承來建立,在編譯時(shí)刻便確定下來了检访。工廠方法始鱼、(類)適配器、模板方法脆贵、解釋器均屬于該模式医清。
2、對(duì)象模式:用于處理對(duì)象之間的關(guān)系卖氨,這些關(guān)系可以通過組合或聚合來實(shí)現(xiàn)会烙,在運(yùn)行時(shí)刻是可以變化的负懦,更具動(dòng)態(tài)性。除了以上 4 種柏腻,其他的都是對(duì)象模式纸厉。
設(shè)計(jì)模式的分類表
設(shè)計(jì)模式的功能
1、單例(Singleton)模式:某個(gè)類只能生成一個(gè)實(shí)例五嫂,該類提供了一個(gè)全局訪問點(diǎn)供外部獲取該實(shí)例颗品,其拓展是有限多例模式。
2贫导、原型(Prototype)模式:將一個(gè)對(duì)象作為原型抛猫,通過對(duì)其進(jìn)行復(fù)制而克隆出多個(gè)和原型類似的新實(shí)例。
3孩灯、工廠方法(Factory Method)模式:定義一個(gè)用于創(chuàng)建產(chǎn)品的接口闺金,由子類決定生產(chǎn)什么產(chǎn)品。
4峰档、抽象工廠(AbstractFactory)模式:提供一個(gè)創(chuàng)建產(chǎn)品族的接口败匹,其每個(gè)子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。
5讥巡、建造者(Builder)模式:將一個(gè)復(fù)雜對(duì)象分解成多個(gè)相對(duì)簡(jiǎn)單的部分掀亩,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對(duì)象欢顷。
6槽棍、代理(Proxy)模式:為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問。即客戶端通過代理間接地訪問該對(duì)象抬驴,從而限制炼七、增強(qiáng)或修改該對(duì)象的一些特性。
7布持、適配器(Adapter)模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口豌拙,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
8题暖、橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離按傅,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn)胧卤,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度唯绍。
9、裝飾(Decorator)模式:動(dòng)態(tài)的給對(duì)象增加一些職責(zé)枝誊,即增加其額外的功能推捐。
10、外觀(Facade)模式:為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口侧啼,使這些子系統(tǒng)更加容易被訪問牛柒。
11、享元(Flyweight)模式:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對(duì)象的復(fù)用痊乾。
12皮壁、組合(Composite)模式:將對(duì)象組合成樹狀層次結(jié)構(gòu),使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問性哪审。
13蛾魄、模板方法(TemplateMethod)模式:定義一個(gè)操作中的算法骨架,而將算法的一些步驟延遲到子類中湿滓,使得子類可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟滴须。
14、策略(Strategy)模式:定義了一系列算法叽奥,并將每個(gè)算法封裝起來扔水,使它們可以相互替換,且算法的改變不會(huì)影響使用算法的客戶朝氓。
15魔市、命令(Command)模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,使發(fā)出請(qǐng)求的責(zé)任和執(zhí)行請(qǐng)求的責(zé)任分割開赵哲。
16待德、職責(zé)鏈(Chain of Responsibility)模式:把請(qǐng)求從鏈中的一個(gè)對(duì)象傳到下一個(gè)對(duì)象,直到請(qǐng)求被響應(yīng)為止枫夺。通過這種方式去除對(duì)象之間的耦合将宪。
17、狀態(tài)(State)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為能力橡庞。
18较坛、觀察者(Observer)模式:多個(gè)對(duì)象間存在一對(duì)多關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí)毙死,把這種改變通知給其他多個(gè)對(duì)象燎潮,從而影響其他對(duì)象的行為。
19扼倘、中介者(Mediator)模式:定義一個(gè)中介對(duì)象來簡(jiǎn)化原有對(duì)象之間的交互關(guān)系确封,降低系統(tǒng)中對(duì)象間的耦合度,使原有對(duì)象之間不必相互了解再菊。
20爪喘、迭代器(Iterator)模式:提供一種方法來順序訪問聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示纠拔。
21秉剑、訪問者(Visitor)模式:在不改變集合元素的前提下,為一個(gè)集合中的每個(gè)元素提供多種訪問方式稠诲,即每個(gè)元素有多個(gè)訪問者對(duì)象訪問侦鹏。
22诡曙、備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取并保存一個(gè)對(duì)象的內(nèi)部狀態(tài)略水,以便以后恢復(fù)它价卤。
23、解釋器(Interpreter)模式:提供如何定義語(yǔ)言的放法渊涝,以及對(duì)語(yǔ)言句子的解釋方法慎璧,即解釋器。
根據(jù)具體功能分類表
面向?qū)ο笤O(shè)計(jì)原則
1跨释、開閉原則:當(dāng)應(yīng)用的需求改變時(shí)胸私,在不修改軟件實(shí)體的源代碼或者二進(jìn)制代碼的前提下,可以擴(kuò)展模塊的功能鳖谈,使其滿足新的需求岁疼。
作用:
1、方便測(cè)試蚯姆;測(cè)試時(shí)只需要對(duì)擴(kuò)展的代碼進(jìn)行測(cè)試五续。
2、提高代碼的可復(fù)用性龄恋;粒度越小疙驾,被復(fù)用的可能性就越大。
3郭毕、提高軟件的穩(wěn)定性和延續(xù)性它碎,易于擴(kuò)展和維護(hù)。
實(shí)現(xiàn)方式:通過“抽象約束显押、封裝變化”來實(shí)現(xiàn)開閉原則扳肛。通過接口或者抽象類為軟件實(shí)體定義一個(gè)相對(duì)穩(wěn)定的抽象層,而將相同的可變因素封裝在相同的具體實(shí)現(xiàn)類乘碑。
2挖息、里氏替換原則:繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立。子類可以擴(kuò)展父類的功能兽肤,但不能改變父類原有的功能
作用:
1套腹、克服了繼承中重寫父類造成的可復(fù)用性變差的缺點(diǎn)
2、保證了動(dòng)作正確性资铡。即類的擴(kuò)展不會(huì)給已有的系統(tǒng)引入新的錯(cuò)誤电禀,降低了代碼出錯(cuò)的可能性。
實(shí)現(xiàn)方式:繼承笤休,除添加新的方法完成新增功能外尖飞,盡量不要重寫父類的方法
3、依賴倒置原則:高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象政基;抽象不應(yīng)該依賴細(xì)節(jié)贞铣,細(xì)節(jié)應(yīng)該依賴抽象。其核心思想是:要面向接口編程沮明,不要面向?qū)崿F(xiàn)編程咕娄。
作用:
1、依賴倒置原則可以降低類間的耦合性珊擂。
2、依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性费变。
3摧扇、依賴倒置原則可以減少并行開發(fā)引起的風(fēng)險(xiǎn)。
4挚歧、依賴倒置原則可以提高代碼的可讀性和可維護(hù)性扛稽。
實(shí)現(xiàn)方式:
1、每個(gè)類盡量提供接口或抽象類滑负,或者兩者都具備在张。
2、變量的聲明類型盡量是接口或者是抽象類矮慕。
3帮匾、任何類都不應(yīng)該從具體類派生。
4痴鳄、使用繼承時(shí)盡量遵循里氏替換原則
4瘟斜、單一職責(zé)原則:一個(gè)類應(yīng)該有且僅有一個(gè)引起它變化的原因,否則類應(yīng)該被拆分痪寻。核心就是控制類的粒度大小螺句、將對(duì)象解耦、提高其內(nèi)聚性
作用:
1橡类、降低類的復(fù)雜度蛇尚。一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé),其邏輯肯定要比負(fù)責(zé)多項(xiàng)職責(zé)簡(jiǎn)單得多顾画。
2取劫、提高類的可讀性。復(fù)雜性降低亲雪,自然其可讀性會(huì)提高勇凭。
3、提高系統(tǒng)的可維護(hù)性义辕∠罕辏可讀性提高,那自然更容易維護(hù)了。
4璧函、變更引起的風(fēng)險(xiǎn)降低傀蚌。變更是必然的,如果單一職責(zé)原則遵守得好蘸吓,當(dāng)修改一個(gè)功能時(shí)善炫,可以顯著降低對(duì)其他功能的影響。
5库继、接口隔離原則:客戶端不應(yīng)該被迫依賴于它不使用的方法箩艺,一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上
作用:
1、將臃腫龐大的接口分解為多個(gè)粒度小的接口宪萄,可以預(yù)防外來變更的擴(kuò)散艺谆,提高系統(tǒng)的靈活性和可維護(hù)性。
2拜英、接口隔離提高了系統(tǒng)的內(nèi)聚性静汤,減少了對(duì)外交互,降低了系統(tǒng)的耦合性居凶。
3虫给、如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性侠碧;但是抹估,如果定義過小,則會(huì)造成接口數(shù)量過多舆床,使設(shè)計(jì)復(fù)雜化棋蚌;如果定義太大,靈活性降低挨队,無法提供定制服務(wù)谷暮,給整體項(xiàng)目帶來無法預(yù)料的風(fēng)險(xiǎn)。
4盛垦、使用多個(gè)專門的接口還能夠體現(xiàn)對(duì)象的層次湿弦,因?yàn)榭梢酝ㄟ^接口的繼承,實(shí)現(xiàn)對(duì)總接口的定義腾夯。
5颊埃、能減少項(xiàng)目工程中的代碼冗余。過大的大接口里面通常放置許多不用的方法蝶俱,當(dāng)實(shí)現(xiàn)這個(gè)接口的時(shí)候班利,被迫設(shè)計(jì)冗余的代碼。
實(shí)現(xiàn)方式:
1榨呆、接口盡量小罗标,但是要有限度。一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯。
2闯割、為依賴接口的類定制服務(wù)彻消。只提供調(diào)用者需要的方法,屏蔽不需要的方法宙拉。
3宾尚、了解環(huán)境,拒絕盲從谢澈。每個(gè)項(xiàng)目或產(chǎn)品都有選定的環(huán)境因素煌贴,環(huán)境不同,接口拆分的標(biāo)準(zhǔn)就不同深入了解業(yè)務(wù)邏輯锥忿。
4崔步、提高內(nèi)聚,減少對(duì)外交互缎谷。使接口用最少的方法去完成最多的事情。
6灶似、迪米特法則:如果兩個(gè)軟件實(shí)體無須直接通信列林,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用,通過第三方轉(zhuǎn)發(fā)調(diào)用降低類之間的耦合度酪惭,提高模塊的相對(duì)獨(dú)立性
作用:
1希痴、降低了類之間的耦合度,提高了模塊的相對(duì)獨(dú)立性春感。
2砌创、由于親合度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性鲫懒。
實(shí)現(xiàn)方式:
7嫩实、合成復(fù)用原則:在軟件復(fù)用時(shí),要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)窥岩,其次才考慮使用繼承關(guān)系來實(shí)現(xiàn)甲献。
作用:
1、它維持了類的封裝性颂翼。因?yàn)槌煞謱?duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象看不見的晃洒,所以這種復(fù)用又稱為“黑箱”復(fù)用。
2朦乏、新舊類之間的耦合度低球及。這種復(fù)用所需的依賴較少,新對(duì)象存取成分對(duì)象的唯一方法是通過成分對(duì)象的接口呻疹。
3吃引、復(fù)用的靈活性高。這種復(fù)用可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)地引用與成分對(duì)象類型相同的對(duì)象际歼。
實(shí)現(xiàn)方式:將已有的對(duì)象納入新對(duì)象中惶翻,作為新對(duì)象的成員對(duì)象來實(shí)現(xiàn)的,新對(duì)象可以調(diào)用已有對(duì)象的功能鹅心,從而達(dá)到復(fù)用吕粗。
對(duì)于7種設(shè)計(jì)原則其各自的側(cè)重點(diǎn)不同。其中旭愧,開閉原則是總綱颅筋,它告訴我們要對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉输枯;里氏替換原則告訴我們不要破壞繼承體系议泵;依賴倒置原則告訴我們要面向接口編程;單一職責(zé)原則告訴我們實(shí)現(xiàn)類(方法)要職責(zé)單一桃熄;接口隔離原則告訴我們?cè)谠O(shè)計(jì)接口的時(shí)候要精簡(jiǎn)單一先口;迪米特法則告訴我們要降低耦合度;合成復(fù)用原則告訴我們要優(yōu)先使用組合或者聚合關(guān)系復(fù)用瞳收,少用繼承關(guān)系復(fù)用碉京。