

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、設(shè)計模式(3),Design Pattern (3),2024/3/17,Institute of Computer SoftwareNanjing University,1,摘要,Design PatternsWhy, What, HowCreational, Structural and Behavioral Patterns,2024/3/17,Institute of Computer SoftwareNanjing U
2、niversity,2,Behavioral Patterns,行為模式是對在不同的對象之間劃分責(zé)任和算法的抽象化。行為模式不僅僅是關(guān)于類和對象的,而且關(guān)注它們之間的通信模式。類的行為模式:使用繼承關(guān)系在幾個類之間分配行為 – Interpreter, Template Method對象的行為模式:使用對象的聚合來分配行為,2024/3/17,Institute of Computer SoftwareNanjing Univer
3、sity,3,Behavioral Patterns,Chain of ResponsibilityCommand InterpreterIterator MediatorMementoObserver StateStrategy Template MethodVisitor,2024/3/17,Institute of Computer SoftwareNanjing University,4,Chain of
4、Responsibility,Intent使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。Motivation應(yīng)根據(jù)普遍性即從最特殊到最普遍的順序來組織幫助信息,比如用戶界面中會有一個對象來處理幫助請求,但是哪一個對象則取決于上下文給多個對象處理一個請求的機會,從而解耦發(fā)送者和接受者,2024/3/17,Institute of Co
5、mputer SoftwareNanjing University,5,Example,2024/3/17,Institute of Computer SoftwareNanjing University,6,Applicability,有多個對象可以處理一個請求,哪個對象處理該請求則在運行時刻確定在不明確指定接收者的情況下,向多個對象中的一個提交一個請求可處理一個請求的對象集合應(yīng)被動態(tài)制定,2024/3/17,Institut
6、e of Computer SoftwareNanjing University,7,Structure,2024/3/17,Institute of Computer SoftwareNanjing University,8,Participants,Handler定義一個處理請求的接口(可選)實現(xiàn)后繼鏈ConcreteHandler處理它所負責(zé)的請求可訪問它的后繼者如果可處理該請求,就處理之;否則將該請求轉(zhuǎn)發(fā)給它的后
7、繼者Client提交請求,2024/3/17,Institute of Computer SoftwareNanjing University,9,Collaboration,當(dāng)Client提交一個請求時,請求沿鏈傳遞直至有一個ConcreteHandler對象負責(zé)處理它,2024/3/17,Institute of Computer SoftwareNanjing University,10,Sample Code,Conse
8、quences,本質(zhì):分離職責(zé),動態(tài)組合!優(yōu)點降低耦合度:對象僅需知道請求會被“正確”地處理。接收者和發(fā)送者都沒有對方的明確信息增強了給對象指派職責(zé)的靈活性缺點不保證被接受,2024/3/17,Institute of Computer SoftwareNanjing University,11,Implementation,實現(xiàn)后繼者鏈定義新的鏈接使用已有的鏈接,如組合對象連接后繼者:如果沒有已有的引用可定義一個鏈,
9、那么你必須自己引入它們表示請求:最簡單的方式是hard-coded操作調(diào)用,2024/3/17,Institute of Computer SoftwareNanjing University,12,Related Patterns,經(jīng)常與Composite一起使用。這時,一個構(gòu)件的父構(gòu)件可作為它的后繼。,2024/3/17,Institute of Computer SoftwareNanjing University,13,K
10、nown Use:Event Bubbling,Java AWT 1.0,2024/3/17,Institute of Computer SoftwareNanjing University,14,public boolean action(Event event, Object obj){ if (event.target == btnOK){ doOkBtnAction();} else if (event.targe
11、t == btnExit) { doExitBtnAction();} else { return super.action(event.obj);} return true;},DHTML的事件處理Event_Bubbling.html,思考題:有何缺點?,,,Event bubbling,stop,Command,Aliases: Action,TransactionIntent將一個請求封裝為一個對象,從而使你
12、可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤銷的操作Motivation把請求信息和請求執(zhí)行過程封裝起來往往需要把命令請求與處理請求的對象分開,command模式可以把調(diào)用操作的對象與操作的目標(biāo)對象分開允許通過多種途徑調(diào)用同一個請求——請求的重用,2024/3/17,Institute of Computer SoftwareNanjing University,15,Example,The &quo
13、t;check" at a diner,2024/3/17,Institute of Computer SoftwareNanjing University,16,Example,2024/3/17,Institute of Computer SoftwareNanjing University,17,client,invoker,command,configuration,Example,2024/3/17,Instit
14、ute of Computer SoftwareNanjing University,18,receiver,Example,2024/3/17,Institute of Computer SoftwareNanjing University,19,receiver,Example,2024/3/17,Institute of Computer SoftwareNanjing University,20,一系列的命令,Applic
15、ability,抽象出待執(zhí)行的動作以參數(shù)化某對象,可以代替“回調(diào)”函數(shù)在不同的時刻指定、排列和執(zhí)行請求支持取消操作。Execute操作可以在實施前將狀態(tài)存儲起來支持修改日志,這樣當(dāng)系統(tǒng)崩潰時,這些修改可以被重做一遍用構(gòu)建在原語操作上的高層操作構(gòu)造一個系統(tǒng),支持“事務(wù)”,2024/3/17,Institute of Computer SoftwareNanjing University,21,思考題:回憶一下Java Callb
16、ack機制!,Structure,2024/3/17,Institute of Computer SoftwareNanjing University,22,Participants,Command聲明執(zhí)行操作的接口ConcreteCommand將一個接收者對象綁定于一個動作調(diào)用接收者相應(yīng)的操作以實現(xiàn)ExecuteClient創(chuàng)建一個具體命令對象并設(shè)定它的接收者Invoker要求該命令執(zhí)行這個請求Receiver知
17、道如何實施與執(zhí)行一個請求相關(guān)的操作。任何類都可能作為一個接收者,2024/3/17,Institute of Computer SoftwareNanjing University,23,Collaboration,2024/3/17,Institute of Computer SoftwareNanjing University,24,Decouple anInvoker and aReceiver by aCommand,Sam
18、ple Code,Consequences,本質(zhì):封裝請求!將調(diào)用操作的對象與知道如何實現(xiàn)該操作的對象解耦Command是first class object。它們可像其它對象一樣被操縱和擴展可將多個Command裝配成一個復(fù)合Command,一般說來,復(fù)合Command是Composite模式的一個實例增加新的Command很容易,無需改變已有的類缺點:會導(dǎo)致某些系統(tǒng)有過多的具體命令類,2024/3/17,Institute
19、 of Computer SoftwareNanjing University,25,Implementation,How intelligent should a command be?僅確定一個接收者和執(zhí)行該請求的動作自己實現(xiàn)所有功能,不需要額外的接收者支持undo和redo:ConcreteCommand需要存儲額外的狀態(tài)信息(思考題:需要存儲哪些狀態(tài)?單級和多級的undo和redo分別如何實現(xiàn)?)補償式/反操作式;存儲
20、恢復(fù)式避免undo操作中的錯誤積累,有必要存入更多的信息以保證能精確復(fù)原。,2024/3/17,Institute of Computer SoftwareNanjing University,26,Related Patterns,Composite模式可用來實現(xiàn)command組合為實現(xiàn)undo/redo,可以用其他行為模式來管理狀態(tài),如Memento模式。Command被放到history list之前,可以用Prototyp
21、e模式復(fù)制自身,2024/3/17,Institute of Computer SoftwareNanjing University,27,Interpreter,Intent給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。Motivation如果一種特定類型的問題發(fā)生的頻率足夠高, 那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構(gòu)建一個解釋器, 該解釋器通
22、過解釋這些句子來解決該問題。解釋器模式描述了如何為簡單的語言定義一個文法并解釋。,2024/3/17,Institute of Computer SoftwareNanjing University,28,Example,2024/3/17,Institute of Computer SoftwareNanjing University,29,expression ::= literal | alternation | sequen
23、ce | repetition | '(' expression ')‘a(chǎn)lternation ::= expression '|' expressionsequence ::= expression '&' expressionrepetition ::= expression '*'literal ::= 'a' |
24、39;b' | 'c' | ... { 'a' | 'b' | 'c' | ... }*,Example,2024/3/17,Institute of Computer SoftwareNanjing University,30,Example,2024/3/17,Institute of Computer SoftwareNanjing University,
25、31,抽象語法樹,raining & (dogs | cats) *,Applicability,當(dāng)有一個語言需要解釋執(zhí)行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當(dāng)存在以下情況時該模式效果最好:該文法簡單. 對于復(fù)雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構(gòu)建抽象語法樹即可解釋表達式, 這樣可以節(jié)省空間而且還可能節(jié)省時間。效率不是一個關(guān)
26、鍵問題. 最高效的解釋器通常不是通過直接解釋語法分析樹實現(xiàn)的, 而是首先將它們轉(zhuǎn)換成另一種形式。例如,正則表達式通常被轉(zhuǎn)換成狀態(tài)機。但即使在這種情況下, 轉(zhuǎn)換器仍可用解釋器模式實現(xiàn), 該模式仍是有用的。,2024/3/17,Institute of Computer SoftwareNanjing University,32,Structure,2024/3/17,Institute of Computer SoftwareNan
27、jing University,33,Participants,AbstractExpression聲明一個抽象的解釋操作,這個接口為抽象語法樹中所有的節(jié)點所共享TerminalExpression實現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作一個句子中的每一個終結(jié)符需要該類的一個實例NonterminalExpression對文法中的每一條規(guī)則R ::= R1R2. . . Rn都需要一個NonterminalExpression類
28、為從R1到Rn的每個符號都維護一個AbstractExpression類型的實例變量為文法中的非終結(jié)符實現(xiàn)Interpret操作,一般要遞歸地調(diào)用表示R1到Rn的那些對象的解釋操作Context包含解釋器之外的一些全局信息Client建造一個語法抽象樹;調(diào)用interpret(),2024/3/17,Institute of Computer SoftwareNanjing University,34,Collaborat
29、ion,Client構(gòu)建(或被給定)一個句子, 它是NonterminalExpression和TerminalExpression的實例的一個抽象語法樹. 然后初始化上下文并調(diào)用解釋操作。每一非終結(jié)符表達式節(jié)點定義相應(yīng)子表達式的解釋操作。而各終結(jié)符表達式的解釋操作構(gòu)成了遞歸的基礎(chǔ)。每一節(jié)點的解釋操作用上下文來存儲和訪問解釋器的狀態(tài)。,2024/3/17,Institute of Computer SoftwareNanjing
30、University,35,Consequences,本質(zhì):分離實現(xiàn),解釋執(zhí)行!易于改變和擴展文法也易于實現(xiàn)文法復(fù)雜的文法難以維護增加了新的解釋表達式的方式,2024/3/17,Institute of Computer SoftwareNanjing University,36,Implementation,創(chuàng)建抽象語法樹定義解釋操作與Flyweight模式共享終結(jié)符,2024/3/17,Institute of Com
31、puter SoftwareNanjing University,37,Sample Code,Related Patterns,Composite:抽象語法樹是一個復(fù)合模式的實例Flyweight:說明了如何在抽象語法樹中共享終結(jié)符Iterator:解釋器可用一個迭代器遍歷該結(jié)構(gòu)Visitor:可用來在一個類中維護抽象語法樹中的各節(jié)點的行為,2024/3/17,Institute of Computer SoftwareNa
32、njing University,38,Iterator,Aliases:CursorIntent提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內(nèi)部表示。Motivation將對聚合對象的訪問和遍歷從聚合對象中分離出來并放入一個迭代器(iterator) 將遍歷機制與聚合對象分離使我們可以定義不同的迭代器來實現(xiàn)不同的遍歷策略,而無需在聚合接口中列舉它們,2024/3/17,Institute of Comp
33、uter SoftwareNanjing University,39,Example,Java Iterator Interface,2024/3/17,Institute of Computer SoftwareNanjing University,40,public interface Iterator{ boolean hasNext(); next(); void remove();},Polym
34、orphic Iterator,2024/3/17,Institute of Computer SoftwareNanjing University,41,Applicability,訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。支持對聚合對象的多種遍歷。為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口(即, 支持多態(tài)迭代)。,2024/3/17,Institute of Computer SoftwareNanjing Universi
35、ty,42,Structure,2024/3/17,Institute of Computer SoftwareNanjing University,43,Participants,Iterator迭代器定義訪問和遍歷元素的接口ConcreteIterator具體迭代器實現(xiàn)迭代器接口對該聚合遍歷時跟蹤當(dāng)前位置Aggregate聚合定義創(chuàng)建相應(yīng)迭代器對象的接口ConcreteAggregate具體聚合實現(xiàn)創(chuàng)建相應(yīng)迭代器的
36、接口,該操作返回ConcreteIterator的一個適當(dāng)?shù)膶嵗?2024/3/17,Institute of Computer SoftwareNanjing University,44,Collaboration,ConcreteIterator跟蹤聚合中的當(dāng)前對象,并能夠計算出待遍歷的后繼對象,2024/3/17,Institute of Computer SoftwareNanjing University,45,Cons
37、equences,本質(zhì):控制訪問聚合對象中的元素!它支持以不同的方式遍歷一個聚合,復(fù)雜的聚合可用多種方式進行遍歷迭代器簡化了聚合的接口,有了迭代器的遍歷接口,聚合本身就不再需要類似的遍歷接口了在同一個聚合上可以有多個遍歷,每個迭代器保持它自己的遍歷狀態(tài)。因此你可以同時進行多個遍歷。缺點:給客戶端聚集被順序化的錯覺;迭代子給出的聚集元素沒有類型特征,2024/3/17,Institute of Computer Software
38、Nanjing University,46,Implementation,實現(xiàn)很靈活,需要根據(jù)語言的控制結(jié)構(gòu)進行權(quán)衡誰控制迭代?誰定義遍歷算法?迭代器健壯程度如何?附加的迭代器操作多態(tài)的迭代器?迭代器可有特權(quán)訪問用于復(fù)合對象的迭代器,空迭代器,2024/3/17,Institute of Computer SoftwareNanjing University,47,不同的實現(xiàn),寬接口 VS. 窄接口寬接口:一個聚集的接口
39、提供了可以用來修改聚集元素的方法窄接口:一個聚集的接口沒有提供修改聚集元素的方法,2024/3/17,Institute of Computer SoftwareNanjing University,48,白箱聚集 VS. 黑箱聚集,白箱聚集:聚集對象為所有對象提供同一個接口(寬接口)迭代子可以從外部控制聚集元素的迭代,控制的僅僅是一個游標(biāo)—游標(biāo)(Cursor)/外稟(Extrinsic)迭代子,2024/3/17,Institu
40、te of Computer SoftwareNanjing University,49,Sample Code,思考題:此類迭代子的意義,白箱聚集 VS. 黑箱聚集,黑箱聚集:聚集對象為迭代子對象提供一個寬接口,而為其它對象提供一個窄接口。同時保證聚集對象的封裝和迭代子功能的實現(xiàn)。迭代子是聚集的內(nèi)部類,可以自由訪問聚集的元素。迭代子可以自行實現(xiàn)迭代功能并控制聚集元素的迭代邏輯—內(nèi)稟迭代子(Intrinsic Iterator),2
41、024/3/17,Institute of Computer SoftwareNanjing University,50,抽象聚集,具體聚集,具體迭代子,抽象迭代子,客戶端,,,,,,,,-窄接口,-寬接口,Sample Code,其它考慮,主動(Active)迭代子 vs. 被動(Passive)迭代子主動:由客戶調(diào)用next()等迭代方法被動:迭代子自行推進遍歷過程靜態(tài)迭代子 vs. 動態(tài)迭代子靜態(tài):由聚集對象創(chuàng)建并持有聚
42、集對象的快照,在產(chǎn)生后這個快照的內(nèi)容不再變化動態(tài):迭代子保持對聚集元素的引用,任何對聚集內(nèi)容的修改都會反映到迭代子對象上過濾迭代子:掃過聚集元素的同時進行計算,2024/3/17,Institute of Computer SoftwareNanjing University,51,Related Patterns,Composite:Iterator常被應(yīng)用到復(fù)合的遞歸結(jié)構(gòu)上Factory Method:多態(tài)迭代器Memen
43、to:常用Memento來捕獲一個迭代的狀態(tài),2024/3/17,Institute of Computer SoftwareNanjing University,52,延伸閱讀:Java Collections Framework,Mediator,Intent用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。Motivation雖然將一個系統(tǒng)分割成許
44、多對象通常可以增強可復(fù)用性, 但是對象間相互連接的激增又會降低其可復(fù)用性。可以通過將集體行為封裝在一個單獨的mediator對象中以避免這個問題。中介者負責(zé)控制和協(xié)調(diào)一組對象間的交互。中介者充當(dāng)一個中介以使組中的對象不再相互顯式引用。這些對象僅知道中介者, 從而減少了相互連接的數(shù)目。,2024/3/17,Institute of Computer SoftwareNanjing University,53,Example,2024/
45、3/17,Institute of Computer SoftwareNanjing University,54,Example,2024/3/17,Institute of Computer SoftwareNanjing University,55,mediator,colleague,colleague,colleague,Applicability,一組對象以定義良好但是復(fù)雜的方式進行通信。產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理
46、解。一個對象引用其他很多對象并且直接與這些對象通信,導(dǎo)致難以復(fù)用該對象。想定制一個分布在多個類中的行為,而又不想生成太多的子類。,2024/3/17,Institute of Computer SoftwareNanjing University,56,Structure,2024/3/17,Institute of Computer SoftwareNanjing University,57,Participants,Medi
47、ator中介者定義一個接口用于與各同事(Colleague)對象通信ConcreteMediator具體中介者通過協(xié)調(diào)各同事對象實現(xiàn)協(xié)作行為。了解并維護它的各個同事 Colleague每一個同事類都知道它的中介者對象每一個同事對象在需與其他的同事通信的時候,與它的中介者通信,2024/3/17,Institute of Computer SoftwareNanjing University,58,Collaboratio
48、n,同事向一個中介者對象發(fā)送和接收請求。中介者在各同事間適當(dāng)?shù)剞D(zhuǎn)發(fā)請求以實現(xiàn)協(xié)作行為,2024/3/17,Institute of Computer SoftwareNanjing University,59,Sample Code,Consequences,本質(zhì):封裝交互!減少了子類生成:將分布于多個對象間的行為集中在一起它將各Colleague解耦它簡化了對象協(xié)議:多對多?一對多它對對象如何協(xié)作進行了抽象它使控制集中化,
49、中介者模式將交互的復(fù)雜性變?yōu)橹薪檎叩膹?fù)雜性;中介類可能難以復(fù)用,2024/3/17,Institute of Computer SoftwareNanjing University,60,Implementation,忽略抽象的Mediator類,當(dāng)各Colleague僅與一個Mediator一起工作時,沒有必要定義一個抽象的Mediator類Colleague—Mediator通信,可以采用Observer模式,或者在Mediat
50、or中定義一個特殊的通知接口,各Colleague在通信時直接調(diào)用該接口,2024/3/17,Institute of Computer SoftwareNanjing University,61,Related Patterns,Facade是對一個對象子系統(tǒng)的抽象,從而提供了一個更為方便的接口,它的協(xié)議是單向的;Mediator提供了各Colleague對象不支持或不能支持的協(xié)作行為,而且協(xié)議是多向的Colleague可以使用O
51、bserver模式與Mediator通信,2024/3/17,Institute of Computer SoftwareNanjing University,62,Memento,Aliases:Token,SnapshotIntent在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。Motivation一個memento是一個對象, 它存儲另一個對象在某個
52、瞬間的內(nèi)部狀態(tài),而后者稱為備忘錄的原發(fā)器(originator)。當(dāng)需要設(shè)置原發(fā)器的檢查點(checkpoint)時, 取消操作機制會向原發(fā)器請求一個備忘錄。原發(fā)器用描述當(dāng)前狀態(tài)的信息初始化該備忘錄。只有原發(fā)器可以向備忘錄中存取信息,備忘錄對其他的對象“不可見”。,2024/3/17,Institute of Computer SoftwareNanjing University,63,Example,2024/3/17,Instit
53、ute of Computer SoftwareNanjing University,64,ConstraintSolver,Undo?,ConstraintSolver的公共接口可能不足以精確地逆轉(zhuǎn)它對其它對象的作用!,Applicability,必須保存一個對象在某一個時刻的(部分)狀態(tài), 這樣以后需要時它才能恢復(fù)到先前的狀態(tài)如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性,2024/3/17
54、,Institute of Computer SoftwareNanjing University,65,Structure,2024/3/17,Institute of Computer SoftwareNanjing University,66,-wide,-narrow,Participants,Memento備忘錄存儲原發(fā)器對象的內(nèi)部狀態(tài)。原發(fā)器根據(jù)需要決定備忘錄存儲原發(fā)器的哪些內(nèi)部狀態(tài)。防止原發(fā)器以外的其他對象訪問備忘
55、錄。備忘錄實際上有兩個接口,管理者(caretaker) 只能看到備忘錄的窄接口—它只能將備忘錄傳遞給其他對象。相反, 原發(fā)器能夠看到一個寬接口, 允許它訪問返回到先前狀態(tài)所需的所有數(shù)據(jù)。理想的情況是只允許生成本備忘錄的那個原發(fā)器訪問本備忘錄的內(nèi)部狀態(tài)。Originator原發(fā)器創(chuàng)建一個備忘錄,用以記錄當(dāng)前時刻它的內(nèi)部狀態(tài)。使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Caretaker負責(zé)保存好備忘錄不能對備忘錄的內(nèi)容進行操作或檢查,2024/
56、3/17,Institute of Computer SoftwareNanjing University,67,Collaboration,管理器向原發(fā)器請求一個備忘錄, 保留一段時間后,將其送回給原發(fā)器備忘錄是被動的。只有創(chuàng)建備忘錄的原發(fā)器會對它的狀態(tài)進行賦值和檢索,2024/3/17,Institute of Computer SoftwareNanjing University,68,,Consequences
57、,本質(zhì):保存和恢復(fù)內(nèi)部狀態(tài)!保持封裝邊界,該模式把可能很復(fù)雜的Originator內(nèi)部信息對其他對象屏蔽起來它簡化了Originator,讓客戶管理它們請求的狀態(tài)將會簡化Originator,并且使得客戶工作結(jié)束時無需通知Originator使用備忘錄可能代價很高定義窄接口和寬接口:有些語言可能難以保證只有原發(fā)器可以訪問備忘錄的狀態(tài)維護備忘錄的潛在代價,2024/3/17,Institute of Computer Softw
58、areNanjing University,69,Implementation,語言支持寬接口和窄接口的不同實現(xiàn)方法存儲增量式改變:如果備忘錄的創(chuàng)建及其返回(給它們的原發(fā)器)的順序是可預(yù)測的,備忘錄可以僅存儲原發(fā)器內(nèi)部狀態(tài)的增量改變,2024/3/17,Institute of Computer SoftwareNanjing University,70,白箱實現(xiàn),寬接口和寬接口優(yōu)點:簡單缺點:破壞對originator狀態(tài)
59、的封裝,2024/3/17,Institute of Computer SoftwareNanjing University,71,Sample Code,黑箱實現(xiàn),寬接口和窄接口– 雙重接口C++:將Memento的接口設(shè)為私有,同時將Originator設(shè)為Memento的友類Java:內(nèi)部成員類,且所有方法設(shè)置為私有,2024/3/17,Institute of Computer SoftwareNanjing U
60、niversity,72,class Memento{ public: virtual ~Memento(); private: friend class Originator; Memento(); void setState(State *); State * getState(); …,Sample Code,Related Patterns,Command:命
61、令可使用備忘錄來為可撤銷的操作維護狀態(tài)Iterator:當(dāng)備忘錄模式支持多個checkpoints時,在各個checkpoints之間進行遍歷可用迭代模式,2024/3/17,Institute of Computer SoftwareNanjing University,73,2024/3/17,Institute of Computer SoftwareNanjing University,74,Observer,Aliase
62、s :Dependents, Publish-SubscribeIntent定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時, 所有依賴于它的對象都得到通知并被自動更新。Motivation把系統(tǒng)分成一些相互關(guān)聯(lián)的類或者對象,如何維護這些類的實例一致性?-- 不希望為了維護一致性而使各類緊密耦合,2024/3/17,Institute of Computer SoftwareNanjing University,7
63、5,Observer,Motivation這一模式中的關(guān)鍵對象是目標(biāo)(subject)和觀察者(observer)。一個目標(biāo)可以有任意數(shù)目的依賴它的觀察者。一旦目標(biāo)的狀態(tài)發(fā)生改變, 所有的觀察者都得到通知。作為對這個通知的響應(yīng),每個觀察者都將查詢目標(biāo)以使其狀態(tài)與目標(biāo)的狀態(tài)同步。這種交互也稱為發(fā)布-訂閱(publish-subscribe) 。目標(biāo)是通知的發(fā)布者。它發(fā)出通知時并不需知道誰是它的觀察者。可以有任意數(shù)目的觀察者訂閱并接收通
64、知。,2024/3/17,Institute of Computer SoftwareNanjing University,76,Example,最著名的應(yīng)用:MVC,2024/3/17,Institute of Computer SoftwareNanjing University,77,Applicability,當(dāng)一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復(fù)用。
65、當(dāng)對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。當(dāng)一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。,2024/3/17,Institute of Computer SoftwareNanjing University,78,Structure,2024/3/17,Institute of Computer SoftwareNanjing University
66、,79,Participants,Subject(目標(biāo))目標(biāo)知道它的觀察者??梢杂腥我舛鄠€觀察者觀察同一個目標(biāo)。提供注冊和刪除觀察者對象的接口。Observer(觀察者)為那些在目標(biāo)發(fā)生改變時需獲得通知的對象定義一個更新接口。ConcreteSubject(具體目標(biāo))將有關(guān)狀態(tài)存入各ConcreteObserver對象。當(dāng)它的狀態(tài)發(fā)生改變時, 向它的各個觀察者發(fā)出通知。ConcreteObserver(具體觀察者)維護
67、一個指向ConcreteSubject對象的引用。存儲有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致。實現(xiàn)Observer的更新接口以使自身狀態(tài)與目標(biāo)的狀態(tài)保持一致。,2024/3/17,Institute of Computer SoftwareNanjing University,80,Collaboration,注意:發(fā)出改變請求的Observer對象并不立即更新,而是將其推遲到它從目標(biāo)得到一個通知之后。Notify不總是由目標(biāo)對
68、象調(diào)用。它也可被一個觀察者或其它對象調(diào)用,Sample Code,2024/3/17,Institute of Computer SoftwareNanjing University,81,Consequences,本質(zhì):觸發(fā)聯(lián)動!Subject和Observers的抽象耦合:Subject只知道它有一系列的Observers,每個符合抽象的Observer類的簡單接口,但是不知道具體類型支持廣播通信:Subject對象不關(guān)心到底
69、有多少對象對自己感興趣,其唯一責(zé)任是通知它的各觀察者缺點:一個觀察者不知道其它觀察者的存在,出現(xiàn)意外的更新時,難以捕捉錯誤,2024/3/17,Institute of Computer SoftwareNanjing University,82,Implementation,創(chuàng)建目標(biāo)到其觀察者之間的映射觀察多個目標(biāo):擴展update接口誰觸發(fā)更新由目標(biāo)對象的狀態(tài)設(shè)定操作自動調(diào)用notify客戶調(diào)用notify對已刪除目標(biāo)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)-計算機系主頁
- 軟件過程與質(zhì)量-計算機系主頁
- 機器翻譯理論和技術(shù) - 計算機系主頁
- 數(shù)字圖象處理第5章-計算機系主頁
- 第四章繼承和多態(tài)-計算機系主頁
- 第七章運行時刻環(huán)境-計算機系主頁
- 計算機系畢業(yè)設(shè)計外文翻譯---面向?qū)ο髷?shù)據(jù)庫系統(tǒng)
- 計算機系生產(chǎn)實習(xí)報告
- 成都職業(yè)技術(shù)學(xué)院計算機系
- 成都職業(yè)技術(shù)學(xué)院計算機系
- 成都職業(yè)技術(shù)學(xué)院計算機系
- 成都職業(yè)技術(shù)學(xué)院計算機系
- 計算機系外文翻譯---歷史的計算
- 高等計算機系統(tǒng)結(jié)構(gòu)-清華大學(xué)計算機系高性能所
- 計算機系外文翻譯--歷史的計算
- 計算機系畢業(yè)設(shè)計論文
- 數(shù)學(xué)與計算機系網(wǎng)站優(yōu)化
- 太原師范學(xué)院計算機系工程碩士計算機技術(shù)領(lǐng)域
- 計算機系開題報告(附外文翻譯)
- 計算機系年度工作計劃
評論
0/150
提交評論