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