![設(shè)計(jì)模式總結(jié)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/01885a3c-fce5-4400-910e-2f227135f6c3/01885a3c-fce5-4400-910e-2f227135f6c31.gif)
![設(shè)計(jì)模式總結(jié)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/01885a3c-fce5-4400-910e-2f227135f6c3/01885a3c-fce5-4400-910e-2f227135f6c32.gif)
![設(shè)計(jì)模式總結(jié)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/01885a3c-fce5-4400-910e-2f227135f6c3/01885a3c-fce5-4400-910e-2f227135f6c33.gif)
![設(shè)計(jì)模式總結(jié)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/01885a3c-fce5-4400-910e-2f227135f6c3/01885a3c-fce5-4400-910e-2f227135f6c34.gif)
![設(shè)計(jì)模式總結(jié)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/01885a3c-fce5-4400-910e-2f227135f6c3/01885a3c-fce5-4400-910e-2f227135f6c35.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、七大設(shè)計(jì)原則:?jiǎn)我宦氊?zé)原則(SRP):對(duì)于一個(gè)類,應(yīng)該只有一個(gè)導(dǎo)致其變化的原因。涉及模式:門面、Proxy開閉原則(OCP):設(shè)計(jì)一個(gè)模塊時(shí),應(yīng)該使該模塊在不被修改的前提下被擴(kuò)展,即可在不必修改源代碼的情況下改變?cè)撃K的行為。對(duì)擴(kuò)展開放,對(duì)更改封閉。抽象化是關(guān)鍵。涉及模式:Strategy, Simple Factory, Factory Method, Abstract Factory, Builder, Bridge, 門面,Mediator.里氏替換原則(LSP):一個(gè)軟件實(shí)體如果使用的是一個(gè)基類的話,一定適用于其子類,而且根本不能覺察出基類對(duì)象和子類對(duì)象的區(qū)別。(在軟件中如果能夠使用基
2、類對(duì)象,那么一定能夠使用其子類對(duì)象)盡量從抽象類繼承而不從具體類繼承;如果兩個(gè)具體類A和B有繼承關(guān)系,那么最簡(jiǎn)單的是建立一個(gè)抽象類C,讓A和B成為C的子類;如果有一個(gè)由繼承關(guān)系形成的等級(jí)結(jié)構(gòu),則所有樹葉節(jié)點(diǎn)應(yīng)該是具體類而所有樹枝節(jié)點(diǎn)應(yīng)該是抽象類或接口。涉及模式:Strategy, Composite, Proxy依賴倒置原則(DIP):高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。關(guān)鍵是以抽象方式耦合。涉及模式:Factory Method, Prototype, Iterator.接口隔離原則(ISP):使用多個(gè)專門
3、的接口比使用單一的總接口要好。不應(yīng)該強(qiáng)迫客戶依賴于他們不用的方法;一個(gè)類的不內(nèi)聚的“胖接口”應(yīng)該被分解為多組方法,每一組方法都服務(wù)于一組不同的客戶程序。涉及模式:Memento, Iterator.組合/聚合復(fù)用原則(CARP):盡量使用組合/聚合,而不要使用繼承。繼承是類型復(fù)用,白箱復(fù)用,使得超類的細(xì)節(jié)被暴露給子類,當(dāng)超類修改時(shí),子類也被迫修改;組合/聚合可以將已有的對(duì)象納入到新對(duì)象中,使之成為新對(duì)象的一部分,因此新對(duì)象可以調(diào)用已有對(duì)象的功能,是黑箱復(fù)用。如果兩個(gè)類是“Has-a”關(guān)系而非”Is-a”關(guān)系,但設(shè)計(jì)成繼承,肯定違反LSP。迪米特法則(LoD):一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象又盡可能少的
4、了解。(不要和陌生人說(shuō)話)狹義:如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法,可以通過第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。廣義:對(duì)對(duì)象之間的信息流量、流向以及信息的影響進(jìn)行控制;充分體現(xiàn)封裝的概念?;驹瓌t:只跟直接依賴的對(duì)象通信(不要耦合沒有明顯通信需求的2個(gè)對(duì)象)涉及模式:門面、Mediator.GRASP核心是自己干自己能干的事,自己只干自己的事,也就是職責(zé)的分配和實(shí)現(xiàn)高內(nèi)聚。GRASP是對(duì)象職責(zé)分配的基本原則。包括9個(gè)模式:1) Information Expert信息專家將責(zé)任分配給信息專家,信息專家是指具有履行職責(zé)所需信息的類(實(shí)
5、現(xiàn)高內(nèi)聚)。信息專家模式是面向?qū)ο笤O(shè)計(jì)的最基本原則。優(yōu)點(diǎn):信息的擁有者類同時(shí)就是信息的操作者類,可以減少不必要的類之間的關(guān)聯(lián);各類的職責(zé)單一明確,容易理解。滿足了面向?qū)ο笤O(shè)計(jì)的封裝的思想。對(duì)應(yīng)于面向?qū)ο笤O(shè)計(jì)原則中的單一職責(zé)原則。2) Creator創(chuàng)建者誰(shuí)來(lái)創(chuàng)建?當(dāng)以下條件之一為真時(shí),將創(chuàng)建類A實(shí)例的職責(zé)分配給類B:B容納A;B聚集A;B具有A的初始化數(shù)據(jù);B記錄A;B頻繁使用A。優(yōu)點(diǎn):整個(gè)結(jié)構(gòu)清晰易懂;有利于類或組件的重用;防止職責(zé)的分散;降低耦合性。與各種工廠模式相對(duì)應(yīng)(簡(jiǎn)單工廠、工廠方法、抽象工廠)3) Low coupling低耦合如何減少變化所產(chǎn)生的影響?責(zé)任的分配要使(不必要的)耦
6、合保持最低。耦合主要指不同類之間相互關(guān)聯(lián)的緊密程度,應(yīng)該以降低類之間的耦合關(guān)系作為職責(zé)分配的原則。4) High cohesion高內(nèi)聚如何保持對(duì)象有重點(diǎn)、可理解和可管理,同時(shí)還要支持低耦合的作用?責(zé)任的分配要保持高內(nèi)聚。緊密相關(guān)的功能(職責(zé))應(yīng)該分配給同一個(gè)類。低內(nèi)聚的類存在難以被理解和維護(hù),難實(shí)現(xiàn)類的重用,系統(tǒng)脆弱不斷需要修改的缺點(diǎn)(難理解、難復(fù)用、難維護(hù)、脆弱)高內(nèi)聚優(yōu)點(diǎn):可表現(xiàn)關(guān)聯(lián)責(zé)任的一個(gè)抽象,易于實(shí)現(xiàn)類的重用;使維護(hù)工作變得簡(jiǎn)單;使得系統(tǒng)模塊化工作,方便團(tuán)隊(duì)工作。模式優(yōu)點(diǎn):聚集相關(guān)功能,結(jié)構(gòu)清晰,容易理解;類的職責(zé)單一明確,降低類的復(fù)雜程度,使用簡(jiǎn)單,有利于重用;適應(yīng)需求變化,一旦
7、發(fā)生變化時(shí),可以把影響縮小到最小范圍。高內(nèi)聚與低耦合模式是GRASP其他模式的根本。5) Controller控制器Q:在UI層之上第一個(gè)接受和協(xié)調(diào)(控制)系統(tǒng)操作的對(duì)象是哪個(gè)?(誰(shuí)應(yīng)該負(fù)責(zé)處理一個(gè)輸入系統(tǒng)事件?)A:將職責(zé)分配給代表一下選擇之一事物對(duì)象:a) 代表整個(gè)“系統(tǒng)”、“跟對(duì)象”、運(yùn)行軟件的設(shè)備,或者是主要的子系統(tǒng);b) 代表發(fā)生該系統(tǒng)操作的用例場(chǎng)景。(對(duì)于同一用例場(chǎng)景的所有系統(tǒng)事件使用相同的控制器類)A:把接收或者處理系統(tǒng)事件消息的職責(zé)分配給一個(gè)類。這個(gè)類可以代表:整個(gè)系統(tǒng)、設(shè)備或者子系統(tǒng);系統(tǒng)事件發(fā)生時(shí)對(duì)應(yīng)的用例場(chǎng)景,在相同的用例場(chǎng)景中使用相同的控制器來(lái)處理所有的系統(tǒng)事件。GRA
8、SP共識(shí):系統(tǒng)事件的接收與處理通常由一個(gè)高級(jí)類來(lái)代替;一個(gè)子系統(tǒng)會(huì)有很多控制器類,分別處理不同的事務(wù)。正常情況下,控制器類應(yīng)該把需要完成的工作委派給其他的對(duì)象??刂破髦皇菂f(xié)調(diào)或控制這些活動(dòng),本身并不完成大量的工作。優(yōu)點(diǎn):提高了重用的可能性,提供了可插拔的接口它保證了接口層不處理應(yīng)用邏輯;對(duì)用例的狀態(tài)進(jìn)行推理(保證系統(tǒng)操作以合法的順序發(fā)生)。6) Polymorphism多態(tài):GRASP擴(kuò)展模式的一種。Q:當(dāng)行為基于類型變化時(shí),誰(shuí)對(duì)此負(fù)責(zé)?A:當(dāng)相關(guān)候選者或行為基于類型(類)而變化時(shí),使用多態(tài)操作將行為職責(zé)分配給行為所變化的類型。也即是說(shuō)盡量對(duì)抽象層編程,用多態(tài)的方法來(lái)判斷具體應(yīng)該使用哪個(gè)類,而
9、不是用if instance of來(lái)判斷該類是什么,執(zhí)行什么。優(yōu)點(diǎn):易于增加新變化所需的擴(kuò)展(只要實(shí)現(xiàn)了統(tǒng)一的通用接口,便可以實(shí)現(xiàn)行為的擴(kuò)展);無(wú)需影響客戶便能夠引入新的實(shí)現(xiàn);避免重復(fù)代碼;避免重復(fù)的分歧條件。缺點(diǎn):不要為那些假想中的變化添加太多的多態(tài)。GOF中的體現(xiàn):適配器、命令、組合、觀察者、策略等7) Pure Fabrication 純虛構(gòu):GRASP擴(kuò)展模式之一把非問題域中的職責(zé)分配給人工定義的類。原則是將非問題域的職責(zé)分配給人工生成、在業(yè)務(wù)邏輯之外加的類。所謂問題域中的類是指從現(xiàn)實(shí)世界的對(duì)象抽象出來(lái)的類。純虛構(gòu)模式是一種以功能為中心的對(duì)象或行為對(duì)象。用于解決高內(nèi)聚和低耦合之間的矛盾
10、,它要求將一部分類的職責(zé)轉(zhuǎn)移到純虛構(gòu)類中。GOF中的體現(xiàn):適配器、策略模式等8) Indirection 間接/中介:GRASP模式中解決類關(guān)聯(lián)問題的模式Q:如何分配職責(zé)以避免直接耦合?A:將職責(zé)分配給中介對(duì)象,由該對(duì)象來(lái)協(xié)調(diào)其他構(gòu)建或服務(wù),以避免其直接耦合。優(yōu)點(diǎn):高內(nèi)聚(通過把”關(guān)聯(lián)“的功能分散到第三方類,原來(lái)的類可以更加關(guān)注自身功能的實(shí)現(xiàn));低耦合(原本關(guān)聯(lián)類之間不直接關(guān)聯(lián),降低類之間的耦合性);高重用性(第三方類對(duì)”關(guān)聯(lián)“功能的集中處理,與原來(lái)的類對(duì)自身功能的專注,有利于類的重用)。GOF中體現(xiàn):Façade(門面)、mediator模式、代理模式、中介者模式等對(duì)應(yīng)迪米特法則。
11、9) Protected Variations變化預(yù)防:GRASP擴(kuò)展模式之一Q:如何給對(duì)象、子系統(tǒng)和系統(tǒng)分配職責(zé),以使這些元素中的變化或不穩(wěn)定性不會(huì)對(duì)其他元素產(chǎn)生不良影響?A:確定預(yù)計(jì)變化或不穩(wěn)定之處,(在其外部)為其創(chuàng)建穩(wěn)定“接口”以分配職責(zé)。優(yōu)點(diǎn):提高系統(tǒng)對(duì)變化的應(yīng)對(duì)能力;高內(nèi)聚;低耦合。與開閉原則相對(duì)應(yīng)。大多數(shù)設(shè)計(jì)原則和GOF模式都是變化預(yù)防模式的體現(xiàn)。GRASP小結(jié):主要特征:對(duì)象職責(zé)分配的基本原則;主要應(yīng)用在分析和建模上。核心思想的理解:自己干自己的事(職責(zé)的分配);自己干自己的能干的事(職責(zé)的分配);自己只干自己的事(職責(zé)的內(nèi)聚)GOF設(shè)計(jì)模式按目的分:創(chuàng)建型:用于創(chuàng)建對(duì)象;結(jié)構(gòu)
12、型:用于處理類或?qū)ο蟮慕M合;行為型:用于描述對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)。按范圍分:類模式:處理類和子類之間的關(guān)系,屬于靜態(tài);對(duì)象模式:處理對(duì)象之間的關(guān)系,動(dòng)態(tài)。創(chuàng)建型模式對(duì)類的實(shí)例化過程進(jìn)行了抽象,能夠?qū)④浖K中對(duì)象的創(chuàng)建和對(duì)象的使用分離。目的就是封裝對(duì)象創(chuàng)建的變化。結(jié)構(gòu)型模式,關(guān)注的是對(duì)象之間組合的方式。行為型模式關(guān)注的是對(duì)象的行為,需要做的是對(duì)變化的行為進(jìn)行抽象,通過封裝以達(dá)到整個(gè)架構(gòu)的可擴(kuò)展性。策略模式,就是將可能存在變化的策略或算法抽象為一個(gè)獨(dú)立的接口或抽象類,以實(shí)現(xiàn)策略擴(kuò)展的目的。Command模式、State模式、Vistor模式、Iterator模式概莫如是?;蛘叻庋b一個(gè)
13、請(qǐng)求(Command模式),或者封裝一種狀態(tài)(State模式),或者封裝“訪問”的方式(Visitor模式),或者封裝“遍歷”算法(Iterator模式)。而這些所要封裝的行為,恰恰是軟件架構(gòu)中最不穩(wěn)定的部分,其擴(kuò)展的可能性也最大。將這些行為封裝起來(lái),利用抽象的特性,就提供了擴(kuò)展的可能。創(chuàng)建型模式簡(jiǎn)單工廠簡(jiǎn)單工廠模式是由一個(gè)工廠類根據(jù)傳入的參量決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例,涉及工廠角色(Creator)、抽象產(chǎn)品(Product)角色及具體產(chǎn)品(Concrete Product)角色等三個(gè)角色。在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。簡(jiǎn)單工廠模式專門定義一個(gè)類來(lái)負(fù)責(zé)創(chuàng)建其他類的實(shí)
14、例,被創(chuàng)建的實(shí)例通常都具有共同的父類。設(shè)計(jì)原則:只在有限的程度上符合“開-閉”原則。“開-閉”原則要求系統(tǒng)允許當(dāng)新的產(chǎn)品加入系統(tǒng)時(shí),無(wú)需對(duì)現(xiàn)有代碼進(jìn)行修改。這一點(diǎn)對(duì)于產(chǎn)品的消費(fèi)角色是成立的,而對(duì)于工廠角色不成立!適用場(chǎng)景:工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少;客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心。工廠方法(關(guān)鍵特征:平行等級(jí)結(jié)構(gòu))符合開閉原則,符合迪米特法則,符合依賴倒臵原則,符合里氏替換原則。引入原因:簡(jiǎn)單工廠中增加新產(chǎn)品時(shí)需要修改工廠類代碼,違反OCP。解決辦法:引入了抽象工廠角色,抽象工廠可以是接口,也可以是抽象類,將實(shí)際創(chuàng)建工作推遲到子類中。典型代碼:抽象工廠中聲明了工廠方法但并
15、未實(shí)現(xiàn)工廠方法,具體產(chǎn)品對(duì)象的創(chuàng)建由其子類負(fù)責(zé),客戶端針對(duì)抽象工廠編程,可在運(yùn)行時(shí)再指定具體工廠類,具體工廠類實(shí)現(xiàn)了工廠方法,不同的具體工廠可以創(chuàng)建不同的具體產(chǎn)品。典型代碼:在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有的產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。該核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠子類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。允許系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。PPT3/79使用場(chǎng)景:一個(gè)類不知道它所需要的對(duì)象的類;一個(gè)類通過其子類來(lái)指定創(chuàng)建哪個(gè)對(duì)象;將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類中的某一個(gè),客戶端在使用時(shí)可以無(wú)須關(guān)心是哪一個(gè)工廠
16、子類創(chuàng)建產(chǎn)品子類,需要時(shí)再動(dòng)態(tài)指定。例子:水果農(nóng)場(chǎng)(生產(chǎn)新水果,原來(lái)的農(nóng)場(chǎng)不需要修改)、電視機(jī)工廠(增加新品牌,原來(lái)的工廠不需要修改,只要增加對(duì)應(yīng)品牌的具體子工廠即可)。優(yōu)點(diǎn):多態(tài)性(客戶代碼可以做到與特定應(yīng)用無(wú)關(guān),適用于任何實(shí)體類);基類為factory method提供缺省實(shí)現(xiàn),子類可以重寫新的實(shí)現(xiàn),也可以繼承父類的實(shí)現(xiàn)。加一層間接性,增加了靈活性。良好的封裝性,代碼結(jié)構(gòu)清晰;擴(kuò)展性好(對(duì)工廠類);屏蔽產(chǎn)品類;典型的解耦框架(高層模塊只需要知道產(chǎn)品的抽象類,其他的實(shí)現(xiàn)類都不需要關(guān)心)。缺點(diǎn):需要Creator 和相應(yīng)的子類作為factory method的載體,如果應(yīng)用模型確實(shí)需要crea
17、tor和子類存在,則很好;否則的話,需要增加一個(gè)類層次。相關(guān)的模式:Simple factory:如果只有一個(gè)具體工廠類,可以改造為Simple factory;Abstract factory:經(jīng)常用工廠方法來(lái)實(shí)現(xiàn);Prototype:不需要?jiǎng)?chuàng)建Creator的子類,但它們通常需要一個(gè)針對(duì)Product類的Initialize操作Template Method:工廠方法經(jīng)常被調(diào)用。抽象工廠(關(guān)鍵詞:多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),產(chǎn)品族(產(chǎn)品等級(jí)結(jié)構(gòu)),一次創(chuàng)建一族產(chǎn)品對(duì)象)引入:工廠方法中每個(gè)工廠只生產(chǎn)一類產(chǎn)品,可能導(dǎo)致系統(tǒng)中存在大量工廠類,增加系統(tǒng)開銷。解決辦法:將一些相關(guān)的產(chǎn)品組成一個(gè)“產(chǎn)品族”,由
18、同一個(gè)工廠來(lái)統(tǒng)一生產(chǎn)。產(chǎn)品族:位于不同的產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族;每個(gè)產(chǎn)品族中含有產(chǎn)品的數(shù)目,與產(chǎn)品等級(jí)結(jié)構(gòu)的數(shù)目相等。產(chǎn)品族中的產(chǎn)品是不同類型本質(zhì)的產(chǎn)品,比如電視和冰箱。描述:具體工廠實(shí)現(xiàn)了抽象工廠,每個(gè)具體工廠方法可返回一個(gè)特定的產(chǎn)品對(duì)象,而同一個(gè)具體工廠所創(chuàng)建的產(chǎn)品對(duì)象構(gòu)成了一個(gè)產(chǎn)品族。使用場(chǎng)景:該系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品(高低硬件配置的顯卡、打印驅(qū)動(dòng)例子);同屬于同一產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束條件必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái);系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn);一個(gè)對(duì)象族(或一組沒有任
19、何關(guān)系的對(duì)象)有相同的約束。關(guān)注點(diǎn)分離,將對(duì)象的創(chuàng)建和對(duì)象的使用分離。Client不依賴于具體工廠將實(shí)現(xiàn)的信息隱藏起來(lái),使得用戶不必關(guān)注實(shí)現(xiàn)的細(xì)節(jié)隱藏創(chuàng)建具體類的信息,使其對(duì)Client不可見。優(yōu)點(diǎn):分離了具體的類,一個(gè)工廠封裝創(chuàng)建產(chǎn)品對(duì)象的責(zé)任和過程,它將客戶與類的實(shí)現(xiàn)分離;易于交換產(chǎn)品系列,只需改變具體工廠就可以使用不同的產(chǎn)品配置;有利于產(chǎn)品的一致性,當(dāng)一個(gè)系列中的產(chǎn)品對(duì)象被設(shè)計(jì)成一起工作時(shí),一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象。缺點(diǎn):難以支持新的產(chǎn)品等級(jí)結(jié)構(gòu)(AbstractProductX),支持新的產(chǎn)品等級(jí)結(jié)構(gòu)就要擴(kuò)展抽象工廠的接口。開閉原則:增加產(chǎn)品族時(shí)滿足開閉原則,在產(chǎn)品等級(jí)結(jié)
20、構(gòu)數(shù)目不變的情況下,在每一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中增加新的具體產(chǎn)品角色,在系統(tǒng)中加入新的具體工廠類即可;增加產(chǎn)品等級(jí)結(jié)構(gòu)時(shí)不滿足開閉,需要給每一個(gè)具體工廠類增加一個(gè)新的工廠方法。以傾斜的方式支持增加新產(chǎn)品,為新產(chǎn)品族增加提供方便,不能為新的產(chǎn)品等級(jí)結(jié)構(gòu)提供方便。所有的工廠模式規(guī)則對(duì)象應(yīng)該要么構(gòu)造和/或管理其他對(duì)象,要么使用對(duì)象,而不應(yīng)該兼而有之。Singleton模式組合模式優(yōu)點(diǎn):組合模式可以很容易地增加新種類的構(gòu)件;使用組合模式可以使客戶端變得很容易設(shè)計(jì),因?yàn)榭蛻舳瞬恍枰罉?gòu)件是葉子還是容器對(duì)象。缺點(diǎn):使用組合模式后,控制容器對(duì)象的類型就不太容易;用繼承的方法增加新的行為很困難。裝飾者模式符合開閉
21、原則引入:如何應(yīng)對(duì)“給一個(gè)對(duì)象,而不是整個(gè)類添加功能”, 使“對(duì)象功能的擴(kuò)展”能夠根據(jù)需要來(lái)動(dòng)態(tài)地實(shí)現(xiàn)。裝飾者模式中Decorator和Component之間,既有動(dòng)態(tài)聚合關(guān)系又有靜態(tài)繼承關(guān)系。聚合的好處是可以在運(yùn)行時(shí)給對(duì)象增加職責(zé),Decorator【HAS A】Component的目的是讓ConcreteDecorator可以在運(yùn)行時(shí)動(dòng)態(tài)給ConcreteComponent增加職責(zé);Decorator繼承于Component的目的是統(tǒng)一裝飾者和被裝飾者的接口,即:不管是ConcretComponent還是ConcreteDecorator,用戶代碼可以把它們統(tǒng)一看作Component來(lái)處理
22、。裝飾者模式通過繼承統(tǒng)一了裝飾者和被裝飾者的接口,通過聚合獲得了在運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展被裝飾者對(duì)象的能力。使用場(chǎng)景:有一個(gè)基本功能,還有些可選功能,每一個(gè)具體的對(duì)象,在基本功能的基礎(chǔ)上通過選用不同的可選功能來(lái)定制。優(yōu)點(diǎn):裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是裝飾模式可以提供比繼承更多的靈活性;可以通過一種動(dòng)態(tài)的方式來(lái)擴(kuò)展一個(gè)對(duì)象的功能;通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合,可以使用多個(gè)具體裝飾類來(lái)裝飾同一對(duì)象,得到功能更為強(qiáng)大的對(duì)象;具體構(gòu)件類與具體裝飾類可以獨(dú)立變化,符合開閉原則。缺點(diǎn):使用裝飾模式進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)將產(chǎn)生很多小對(duì)象,同時(shí)還將產(chǎn)生很
23、多具體裝飾類;裝飾模式比繼承更加易于出錯(cuò),排錯(cuò)也很困難。相關(guān)模式區(qū)別:Adapter:Decorator模式中裝飾僅改變對(duì)象的職責(zé)而不改變它的接口,而Adapter模式中適配器將給對(duì)象一個(gè)全新的接口;Composite:可以將裝飾視為一個(gè)退化的僅有一個(gè)組件的組合,Decorator的目的不在于對(duì)象聚集;Strategy:用一個(gè)裝飾可以改變對(duì)象的外表,而Strategy模式可以改變對(duì)象的內(nèi)核。Façade模式符合單一職責(zé)原則,符合迪米特法則引入:簡(jiǎn)化外部客戶程序和系統(tǒng)間的交互接口,將外部客戶程序的演化和內(nèi)部子系統(tǒng)的變化之間的依賴相互解耦。外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面(F
24、açade)對(duì)象進(jìn)行,這就是門面模式。為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)açade模式定義了一個(gè)高層接口,這個(gè)接口使這一子系統(tǒng)更加容易使用。注意:子系統(tǒng)并不知道Façade的存在,在它看來(lái)Façade只是一個(gè)client.使用場(chǎng)景:為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口;提高子系統(tǒng)的獨(dú)立性;在層次化結(jié)構(gòu)中,可以使用Façade模式定義系統(tǒng)中每一層的入口;只需要使用某個(gè)復(fù)雜系統(tǒng)的子集,或者,需要以一種特殊的方式與系統(tǒng)進(jìn)行交互。綠色斜體只理解意圖即可Proxy模式引入:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。對(duì)于每一個(gè)開銷很大的對(duì)象,應(yīng)該根
25、據(jù)需要進(jìn)行創(chuàng)建。Template Method模板方法引入:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。使用場(chǎng)景:復(fù)用問題,也即許多框架結(jié)構(gòu)上相似,但卻在細(xì)節(jié)上稍有不同(連接不同類型數(shù)據(jù)庫(kù)的例子);約束和規(guī)則,程序中有些規(guī)則、約束我們希望不會(huì)被違反(臨界資源使用的例子)。Command模式引入:如何將“行為請(qǐng)求者”與“行為實(shí)現(xiàn)者”解耦?解決辦法:將一組行為抽象為對(duì)象,可以實(shí)現(xiàn)二者之間的松耦合。命令模式的本質(zhì)是對(duì)命令進(jìn)行封裝,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,允許請(qǐng)求的一方和接收的一方獨(dú)立開來(lái),使得請(qǐng)求的一方不必知道
26、接收請(qǐng)求的一方的接口。實(shí)現(xiàn)要點(diǎn):實(shí)現(xiàn)Command接口的具體命令對(duì)象ConcreteCommand有時(shí)侯根據(jù)需要可能會(huì)保存一些額外的狀態(tài)信息;通過使用組合模式,可以將多個(gè)“命令”封裝為一個(gè)“復(fù)合命令”。相關(guān)模式:Composite模式可用來(lái)實(shí)現(xiàn)command組合;為實(shí)現(xiàn)undo/redo,可以用其他行為模式來(lái)管理狀態(tài),如Memento模式;Command被放到history list之前,可以用Prototype模式復(fù)制自身。Iterator模式引入:提供一種方法順序訪問一個(gè)聚集對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。將對(duì)聚集對(duì)象的訪問和遍歷從聚集對(duì)象中分離出來(lái)并放入一個(gè)迭代器(iterator) n 將遍歷機(jī)制與聚集對(duì)象分離使我們可以定義不同的迭代器來(lái)實(shí)現(xiàn)不同的遍歷策略,而無(wú)需在聚集接口中列舉它們。說(shuō)明:在迭代器模式中應(yīng)用了工廠方法模式,聚集類充當(dāng)工廠類,而迭代器充當(dāng)產(chǎn)品類,由于定義了抽象層,系統(tǒng)的擴(kuò)展性很好,在客戶端可以針對(duì)抽象聚集類和抽象迭代器進(jìn)行編程。Strategy策略模式符合開閉,符合里氏替換原則引入:某些對(duì)象使用的算法可能多種多樣,經(jīng)常
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60670-21:2024 EN-FR Boxes and enclosures for electrical accessories for household and similar fixed electrical installations - Part 21: Particular requirements for boxes
- 存量房屋買賣協(xié)議書
- 木門安裝工程合同
- 門面房裝修合同書(6篇)
- 房地產(chǎn)項(xiàng)目認(rèn)購(gòu)協(xié)議
- 技術(shù)改造借款合同書
- 解決某個(gè)問題的解決方案報(bào)告
- 農(nóng)業(yè)生產(chǎn)環(huán)境保護(hù)與監(jiān)測(cè)方案
- 委托投資協(xié)議合同
- 小學(xué)詞語(yǔ)聽活動(dòng)方案
- 2024-2025學(xué)年山東省濰坊市高三上學(xué)期1月期末英語(yǔ)試題
- 2025年安徽碳鑫科技有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年寒假實(shí)踐特色作業(yè)設(shè)計(jì)模板
- 過敏性肺泡炎課件
- 客運(yùn)車輛進(jìn)站協(xié)議書
- 2022-2023學(xué)年杭州市六年級(jí)下學(xué)期數(shù)學(xué)期末考試試卷及答案解析
- 公務(wù)員錄用審批表
- 重慶市住宅裝飾裝修工程質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 部編版初中語(yǔ)文七至九年級(jí)語(yǔ)文教材各冊(cè)人文主題與語(yǔ)文要素匯總一覽表合集單元目標(biāo)能力點(diǎn)
- 新蘇教版六年級(jí)下冊(cè)《科學(xué)》全一冊(cè)全部課件(共16課)
- 幼兒園食品安全教育培訓(xùn)ppt課件模板
評(píng)論
0/150
提交評(píng)論