10.設(shè)計(jì)模式
1.精通設(shè)計(jì)模式
1.六大設(shè)計(jì)原則解析, OO的五大原則,具現(xiàn)化后就是具體的設(shè)計(jì)模式
-
單一職責(zé)原則(SRP): 就一個(gè)類(lèi)而言猛蔽,應(yīng)該僅有一個(gè)引起它變化的原因, 只專(zhuān)心做一件事
- 含義
- 該原則提出對(duì)象不應(yīng)該承擔(dān)太多職責(zé)倍奢,如果一個(gè)對(duì)象承擔(dān)了太多的職責(zé)魏颓,至少存在以下兩個(gè)缺點(diǎn):
- 一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類(lèi)實(shí)現(xiàn)其他職責(zé)的能力;
- 當(dāng)客戶(hù)端需要該對(duì)象的某一個(gè)職責(zé)時(shí)秩伞,不得不將其他不需要的職責(zé)全都包含進(jìn)來(lái)摄悯,從而造成冗余代碼或代碼的浪費(fèi)峡竣。
- 該原則提出對(duì)象不應(yīng)該承擔(dān)太多職責(zé)倍奢,如果一個(gè)對(duì)象承擔(dān)了太多的職責(zé)魏颓,至少存在以下兩個(gè)缺點(diǎn):
- 作用
- 單一職責(zé)原則的核心就是控制類(lèi)的粒度大小、將對(duì)象解耦凛澎、提高其內(nèi)聚性泌绣。如果遵循單一職責(zé)原則將有以下優(yōu)點(diǎn)。
- 降低類(lèi)的復(fù)雜度预厌。一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé),其邏輯肯定要比負(fù)責(zé)多項(xiàng)職責(zé)簡(jiǎn)單得多元媚。
- 提高類(lèi)的可讀性轧叽。復(fù)雜性降低,自然其可讀性會(huì)提高刊棕。
- 提高系統(tǒng)的可維護(hù)性炭晒。可讀性提高甥角,那自然更容易維護(hù)了网严。
- 變更引起的風(fēng)險(xiǎn)降低。變更是必然的嗤无,如果單一職責(zé)原則遵守得好震束,當(dāng)修改一個(gè)功能時(shí),可以顯著降低對(duì)其他功能的影響当犯。
- 單一職責(zé)原則的核心就是控制類(lèi)的粒度大小、將對(duì)象解耦凛澎、提高其內(nèi)聚性泌绣。如果遵循單一職責(zé)原則將有以下優(yōu)點(diǎn)。
- 實(shí)現(xiàn)方法
- 單一職責(zé)原則是最簡(jiǎn)單但又最難運(yùn)用的原則垢村,需要設(shè)計(jì)人員發(fā)現(xiàn)類(lèi)的不同職責(zé)并將其分離,再封裝到不同的類(lèi)或模塊中嚎卫。而發(fā)現(xiàn)類(lèi)的多重職責(zé)需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn)
- 含義
-
開(kāi)放封閉原則(開(kāi)閉原則OCP): 對(duì)變更關(guān)閉,對(duì)擴(kuò)展開(kāi)放. 對(duì)頻繁變化的那些部分做出抽象,符合重用的特性
-
含義
- 當(dāng)應(yīng)用的需求改變時(shí)嘉栓,在不修改軟件實(shí)體的源代碼或者二進(jìn)制代碼的前提下,可以擴(kuò)展模塊的功能拓诸,使其滿(mǎn)足新的需求侵佃。
-
作用
開(kāi)閉原則是面向?qū)ο蟪绦蛟O(shè)計(jì)的終極目標(biāo),它使軟件實(shí)體擁有一定的適應(yīng)性和靈活性的同時(shí)具備穩(wěn)定性和延續(xù)性奠支。具體來(lái)說(shuō)馋辈,其作用如下。
- 對(duì)軟件測(cè)試的影響
軟件遵守開(kāi)閉原則的話胚宦,軟件測(cè)試時(shí)只需要對(duì)擴(kuò)展的代碼進(jìn)行測(cè)試就可以了首有,因?yàn)樵械臏y(cè)試代碼仍然能夠正常運(yùn)行。
- 可以提高代碼的可復(fù)用性
粒度越小枢劝,被復(fù)用的可能性就越大井联;在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,根據(jù)原子和抽象編程可以提高代碼的可復(fù)用性您旁。
- 可以提高軟件的可維護(hù)性
遵守開(kāi)閉原則的軟件烙常,其穩(wěn)定性高和延續(xù)性強(qiáng),從而易于擴(kuò)展和維護(hù)。
-
實(shí)現(xiàn)方法
可以通過(guò)“抽象約束蚕脏、封裝變化”來(lái)實(shí)現(xiàn)開(kāi)閉原則侦副,即通過(guò)接口或者抽象類(lèi)為軟件實(shí)體定義一個(gè)相對(duì)穩(wěn)定的抽象層,而將相同的可變因素封裝在相同的具體實(shí)現(xiàn)類(lèi)中驼鞭。
-
-
**里式替換原則(LSP): **
- 含義
- 里氏替換原則主要闡述了有關(guān)繼承的一些原則秦驯,也就是什么時(shí)候應(yīng)該使用繼承,什么時(shí)候不應(yīng)該使用繼承挣棕,以及其中蘊(yùn)含的原理译隘。里氏替換原是繼承復(fù)用的基礎(chǔ),它反映了基類(lèi)與子類(lèi)之間的關(guān)系洛心,是對(duì)開(kāi)閉原則的補(bǔ)充固耘,是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范
- 作用
- 里氏替換原則是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一。
- 它克服了繼承中重寫(xiě)父類(lèi)造成的可復(fù)用性變差的缺點(diǎn)词身。
- 它是動(dòng)作正確性的保證厅目。即類(lèi)的擴(kuò)展不會(huì)給已有的系統(tǒng)引入新的錯(cuò)誤,降低了代碼出錯(cuò)的可能性法严。
- 實(shí)現(xiàn)方法 --鳥(niǎo)基類(lèi)與企鵝子類(lèi)
- 子類(lèi)可以擴(kuò)展父類(lèi)的功能, 但不能改變父類(lèi)原有的功能,子類(lèi)可以實(shí)現(xiàn)父類(lèi)的抽象方法,但是不能覆蓋父類(lèi)的非抽象方法.父類(lèi)的已經(jīng)實(shí)現(xiàn)的方法,不能重寫(xiě)
- 子類(lèi)中可以增加自己特有的方法,擴(kuò)展功能就另寫(xiě)一個(gè)方法
- 當(dāng)子類(lèi)一定要覆蓋或?qū)崿F(xiàn)父類(lèi)的方法時(shí),方法的前置條件(即方法的形參)要比父類(lèi)方法的輸入?yún)?shù)更寬松
- 含義
-
**依賴(lài)倒置原則(DIP): **
-
含義
- 高層模塊不應(yīng)該依賴(lài)低層模塊损敷,兩者都應(yīng)該依賴(lài)其抽象;抽象不應(yīng)該依賴(lài)細(xì)節(jié)渐夸,細(xì)節(jié)應(yīng)該依賴(lài)抽象
- 其核心思想是:要面向接口編程嗤锉,不要面向?qū)崿F(xiàn)編程。
- 使用接口或者抽象類(lèi)的目的是制定好規(guī)范和契約墓塌,而不去涉及任何具體的操作瘟忱,把展現(xiàn)細(xì)節(jié)的任務(wù)交給它們的實(shí)現(xiàn)類(lèi)去完成。
-
作用
- 依賴(lài)倒置原則可以降低類(lèi)間的耦合性苫幢。
- 依賴(lài)倒置原則可以提高系統(tǒng)的穩(wěn)定性访诱。
- 依賴(lài)倒置原則可以減少并行開(kāi)發(fā)引起的風(fēng)險(xiǎn)。
- 依賴(lài)倒置原則可以提高代碼的可讀性和可維護(hù)性韩肝。
-
實(shí)現(xiàn)方法
(自己的理解:父類(lèi)定義抽象方法,子類(lèi)去實(shí)現(xiàn)方法細(xì)節(jié),實(shí)現(xiàn)類(lèi)的方法定義里用父類(lèi)的實(shí)例做為參數(shù),實(shí)例化實(shí)現(xiàn)類(lèi)的時(shí)候根據(jù)傳入的不同的子類(lèi)實(shí)例從而省去在實(shí)現(xiàn)類(lèi)方法定義時(shí)的大量判斷,這樣上層類(lèi)不依賴(lài)底層類(lèi))
- 每個(gè)類(lèi)盡量提供接口或抽象類(lèi)触菜,或者兩者都具備。
- 變量的聲明類(lèi)型盡量是接口或者是抽象類(lèi)哀峻。
- 任何類(lèi)都不應(yīng)該從具體類(lèi)派生涡相。
- 使用繼承時(shí)盡量遵循里氏替換原則。
-
-
接口隔離原則(ISP):
-
含義
- 要為各個(gè)類(lèi)建立它們需要的專(zhuān)用接口剩蟀,而不要試圖去建立一個(gè)很龐大的接口供所有依賴(lài)它的類(lèi)去調(diào)用
- 接口隔離原則和單一職責(zé)都是為了提高類(lèi)的內(nèi)聚性催蝗、降低它們之間的耦合性,體現(xiàn)了封裝的思想育特,但兩者是不同的:
- 單一職責(zé)原則注重的是職責(zé)丙号,而接口隔離原則注重的是對(duì)接口依賴(lài)的隔離。
- 單一職責(zé)原則主要是約束類(lèi),它針對(duì)的是程序中的實(shí)現(xiàn)和細(xì)節(jié)犬缨;接口隔離原則主要約束接口喳魏,主要針對(duì)抽象和程序整體框架的構(gòu)建。
-
作用
- 將臃腫龐大的接口分解為多個(gè)粒度小的接口怀薛,可以預(yù)防外來(lái)變更的擴(kuò)散刺彩,提高系統(tǒng)的靈活性和可維護(hù)性。
- 接口隔離提高了系統(tǒng)的內(nèi)聚性枝恋,減少了對(duì)外交互迂苛,降低了系統(tǒng)的耦合性。
- 如果接口的粒度大小定義合理鼓择,能夠保證系統(tǒng)的穩(wěn)定性;但是就漾,如果定義過(guò)小呐能,則會(huì)造成接口數(shù)量過(guò)多,使設(shè)計(jì)復(fù)雜化抑堡;如果定義太大摆出,靈活性降低,無(wú)法提供定制服務(wù)首妖,給整體項(xiàng)目帶來(lái)無(wú)法預(yù)料的風(fēng)險(xiǎn)偎漫。
- 使用多個(gè)專(zhuān)門(mén)的接口還能夠體現(xiàn)對(duì)象的層次,因?yàn)榭梢酝ㄟ^(guò)接口的繼承有缆,實(shí)現(xiàn)對(duì)總接口的定義象踊。
- 能減少項(xiàng)目工程中的代碼冗余。過(guò)大的大接口里面通常放置許多不用的方法棚壁,當(dāng)實(shí)現(xiàn)這個(gè)接口的時(shí)候杯矩,被迫設(shè)計(jì)冗余的代碼。
-
實(shí)現(xiàn)方法
(抽象來(lái)說(shuō):使用多個(gè)接口替換一個(gè)接口,舉例:接口相當(dāng)于劇本中一個(gè)角色,由哪個(gè)演員來(lái)演相當(dāng)于接口的實(shí)現(xiàn),針對(duì)于不同的客戶(hù)端.具體來(lái)說(shuō):把一個(gè)父類(lèi)的多個(gè)方法,拆成多個(gè)父類(lèi)的方法,子類(lèi)去繼承不同的父類(lèi),而不必實(shí)現(xiàn)無(wú)用的父類(lèi)方法,實(shí)現(xiàn)類(lèi)把父類(lèi)的實(shí)例作為參數(shù)調(diào)用)
- 接口盡量小袖外,但是要有限度史隆。一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯。
- 為依賴(lài)接口的類(lèi)定制服務(wù)曼验。只提供調(diào)用者需要的方法泌射,屏蔽不需要的方法。
- 了解環(huán)境鬓照,拒絕盲從熔酷。每個(gè)項(xiàng)目或產(chǎn)品都有選定的環(huán)境因素,環(huán)境不同颖杏,接口拆分的標(biāo)準(zhǔn)就不同深入了解業(yè)務(wù)邏輯纯陨。
- 提高內(nèi)聚,減少對(duì)外交互。使接口用最少的方法去完成最多的事情
-
-
迪米特法則原則(LoD 最少知識(shí)原則):
-
含義
- 只與你的直接朋友交談翼抠,不跟“陌生人”說(shuō)話(Talk only to your immediate friends and not to strangers)咙轩。其含義是:如果兩個(gè)軟件實(shí)體無(wú)須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用阴颖,可以通過(guò)第三方轉(zhuǎn)發(fā)該調(diào)用活喊。其目的是降低類(lèi)之間的耦合度,提高模塊的相對(duì)獨(dú)立性量愧。
- 迪米特法則中的“朋友”是指:當(dāng)前對(duì)象本身钾菊、當(dāng)前對(duì)象的成員對(duì)象、當(dāng)前對(duì)象所創(chuàng)建的對(duì)象偎肃、當(dāng)前對(duì)象的方法參數(shù)等煞烫,這些對(duì)象同當(dāng)前對(duì)象存在關(guān)聯(lián)、聚合或組合關(guān)系累颂,可以直接訪問(wèn)這些對(duì)象的方法滞详。
-
作用
- 降低了類(lèi)之間的耦合度,提高了模塊的相對(duì)獨(dú)立性紊馏。
- 由于親合度降低料饥,從而提高了類(lèi)的可復(fù)用率和系統(tǒng)的擴(kuò)展性
-
實(shí)現(xiàn)方法
(子類(lèi)或者實(shí)現(xiàn)類(lèi)如果需要引用多個(gè)其他類(lèi), 找出類(lèi)之間的引用關(guān)系,把有依賴(lài)關(guān)系的類(lèi)減少到最小的依賴(lài),然后層層引用)
- 從依賴(lài)者的角度來(lái)說(shuō),只依賴(lài)應(yīng)該依賴(lài)的對(duì)象朱监。
- 從被依賴(lài)者的角度說(shuō)岸啡,只暴露應(yīng)該暴露的方法。
-
注意
- 在類(lèi)的劃分上赫编,應(yīng)該創(chuàng)建弱耦合的類(lèi)巡蘸。類(lèi)與類(lèi)之間的耦合越弱,就越有利于實(shí)現(xiàn)可復(fù)用的目標(biāo)擂送。
- 在類(lèi)的結(jié)構(gòu)設(shè)計(jì)上赡若,盡量降低類(lèi)成員的訪問(wèn)權(quán)限。
- 在類(lèi)的設(shè)計(jì)上团甲,優(yōu)先考慮將一個(gè)類(lèi)設(shè)置成不變類(lèi)逾冬。
- 在對(duì)其他類(lèi)的引用上,將引用其他對(duì)象的次數(shù)降到最低躺苦。
- 不暴露類(lèi)的屬性成員身腻,而應(yīng)該提供相應(yīng)的訪問(wèn)器(set 和 get 方法)。
- 謹(jǐn)慎使用序列化(Serializable)功能
-
2.常用設(shè)計(jì)思想
- 控制反轉(zhuǎn)(IoC):是說(shuō)創(chuàng)建對(duì)象的控制權(quán)進(jìn)行轉(zhuǎn)移匹厘,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和創(chuàng)建時(shí)機(jī)是由自己把控的嘀趟,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到第三方
- 依賴(lài)注入(DI):在系統(tǒng)運(yùn)行中,動(dòng)態(tài)的向某個(gè)對(duì)象提供它所需要的其他對(duì)象愈诚。這一點(diǎn)是通過(guò)DI(Dependency Injection她按,依賴(lài)注入)來(lái)實(shí)現(xiàn)的
3.面向過(guò)程與對(duì)象的區(qū)別
- 面向過(guò)程的開(kāi)發(fā)牛隅,上層調(diào)用下層,上層依賴(lài)于下層酌泰,當(dāng)下層劇烈變動(dòng)時(shí)上層也要跟著變動(dòng)媒佣,這就會(huì)導(dǎo)致模塊的復(fù)用性降低而且大大提高了開(kāi)發(fā)的成本。
- 面向?qū)ο蟮拈_(kāi)發(fā)很好的解決了這個(gè)問(wèn)題陵刹,一般情況下抽象的變化概率很小默伍,讓用戶(hù)程序依賴(lài)于抽象,實(shí)現(xiàn)的細(xì)節(jié)也依賴(lài)于抽象衰琐。即使實(shí)現(xiàn)細(xì)節(jié)不斷變動(dòng)也糊,只要抽象不變,客戶(hù)程序就不需要變化羡宙。這大大降低了客戶(hù)程序與實(shí)現(xiàn)細(xì)節(jié)的耦合度
4.介紹23種設(shè)計(jì)模式以作了解
設(shè)計(jì)模式的本質(zhì)是面向?qū)ο笤O(shè)計(jì)原則的實(shí)際運(yùn)用狸剃,是對(duì)類(lèi)的封裝性、繼承性和多態(tài)性以及類(lèi)的關(guān)聯(lián)關(guān)系和組合關(guān)系的充分理解狗热。正確使用設(shè)計(jì)模式具有以下優(yōu)點(diǎn)捕捂。
- 可以提高程序員的思維能力、編程能力和設(shè)計(jì)能力斗搞。
- 使程序設(shè)計(jì)更加標(biāo)準(zhǔn)化、代碼編制更加工程化慷妙,使軟件開(kāi)發(fā)效率大大提高僻焚,從而縮短軟件的開(kāi)發(fā)周期。
- 使設(shè)計(jì)的代碼可重用性高膝擂、可讀性強(qiáng)虑啤、可靠性高、靈活性好架馋、可維護(hù)性強(qiáng)狞山。
范圍\目的 | 創(chuàng)建型模式 | 結(jié)構(gòu)型模式 | 行為型模式 |
---|---|---|---|
類(lèi)模式 | 工廠方法(4種) | (類(lèi))適配器(7種) | 模板方法、解釋器(9種) |
對(duì)象模式 | 單例 | 代理 | 策略 |
原型 | (對(duì)象)適配器 | 命令 | |
抽象工廠 | 橋接 | 職責(zé)鏈 | |
建造者 | 裝飾 | 狀態(tài) | |
外觀 | 觀察者 | ||
享元 | 中介者 | ||
組合 | 迭代器 | ||
訪問(wèn)者 | |||
備忘錄 |
- 單例(Singleton)模式:某個(gè)類(lèi)只能生成一個(gè)實(shí)例叉寂,該類(lèi)提供了一個(gè)全局訪問(wèn)點(diǎn)供外部獲取該實(shí)例萍启,其拓展是有限多例模式。
- 原型(Prototype)模式:將一個(gè)對(duì)象作為原型屏鳍,通過(guò)對(duì)其進(jìn)行復(fù)制而克隆出多個(gè)和原型類(lèi)似的新實(shí)例勘纯。
- 工廠方法(Factory Method)模式:定義一個(gè)用于創(chuàng)建產(chǎn)品的接口,由子類(lèi)決定生產(chǎn)什么產(chǎn)品钓瞭。
- 抽象工廠(AbstractFactory)模式:提供一個(gè)創(chuàng)建產(chǎn)品族的接口驳遵,其每個(gè)子類(lèi)可以生產(chǎn)一系列相關(guān)的產(chǎn)品。
- 建造者(Builder)模式:將一個(gè)復(fù)雜對(duì)象分解成多個(gè)相對(duì)簡(jiǎn)單的部分山涡,然后根據(jù)不同需要分別創(chuàng)建它們堤结,最后構(gòu)建成該復(fù)雜對(duì)象唆迁。
- 代理(Proxy)模式:為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。即客戶(hù)端通過(guò)代理間接地訪問(wèn)該對(duì)象竞穷,從而限制唐责、增強(qiáng)或修改該對(duì)象的一些特性。
- 適配器(Adapter)模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口来庭,使得原本由于接口不兼容而不能一起工作的那些類(lèi)能一起工作妒蔚。
- 橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化月弛。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)肴盏,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
- 裝飾(Decorator)模式:動(dòng)態(tài)的給對(duì)象增加一些職責(zé)帽衙,即增加其額外的功能菜皂。
- 外觀(Facade)模式:為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,使這些子系統(tǒng)更加容易被訪問(wèn)厉萝。
- 享元(Flyweight)模式:運(yùn)用共享技術(shù)來(lái)有效地支持大量細(xì)粒度對(duì)象的復(fù)用恍飘。
- 組合(Composite)模式:將對(duì)象組合成樹(shù)狀層次結(jié)構(gòu),使用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問(wèn)性谴垫。
- 模板方法(TemplateMethod)模式:定義一個(gè)操作中的算法骨架章母,而將算法的一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟翩剪。
- 策略(Strategy)模式:定義了一系列算法乳怎,并將每個(gè)算法封裝起來(lái),使它們可以相互替換前弯,且算法的改變不會(huì)影響使用算法的客戶(hù)蚪缀。
- 命令(Command)模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,使發(fā)出請(qǐng)求的責(zé)任和執(zhí)行請(qǐng)求的責(zé)任分割開(kāi)恕出。
- 職責(zé)鏈(Chain of Responsibility)模式:把請(qǐng)求從鏈中的一個(gè)對(duì)象傳到下一個(gè)對(duì)象询枚,直到請(qǐng)求被響應(yīng)為止。通過(guò)這種方式去除對(duì)象之間的耦合浙巫。
- 狀態(tài)(State)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為能力金蜀。
- 觀察者(Observer)模式:多個(gè)對(duì)象間存在一對(duì)多關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí)的畴,把這種改變通知給其他多個(gè)對(duì)象廉油,從而影響其他對(duì)象的行為。
- 中介者(Mediator)模式:定義一個(gè)中介對(duì)象來(lái)簡(jiǎn)化原有對(duì)象之間的交互關(guān)系苗傅,降低系統(tǒng)中對(duì)象間的耦合度抒线,使原有對(duì)象之間不必相互了解。
- 迭代器(Iterator)模式:提供一種方法來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù)渣慕,而不暴露聚合對(duì)象的內(nèi)部表示嘶炭。
- 訪問(wèn)者(Visitor)模式:在不改變集合元素的前提下抱慌,為一個(gè)集合中的每個(gè)元素提供多種訪問(wèn)方式,即每個(gè)元素有多個(gè)訪問(wèn)者對(duì)象訪問(wèn)眨猎。
- 備忘錄(Memento)模式:在不破壞封裝性的前提下抑进,獲取并保存一個(gè)對(duì)象的內(nèi)部狀態(tài),以便以后恢復(fù)它睡陪。
- 解釋器(Interpreter)模式:提供如何定義語(yǔ)言的文法寺渗,以及對(duì)語(yǔ)言句子的解釋方法,即解釋器兰迫。