第6章-行為型模式課件_第1頁(yè)
第6章-行為型模式課件_第2頁(yè)
第6章-行為型模式課件_第3頁(yè)
第6章-行為型模式課件_第4頁(yè)
第6章-行為型模式課件_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章行為型模式(2)第6章行為型模式(2)本章目標(biāo)掌握中介者模式的特點(diǎn)及應(yīng)用掌握觀察者模式的特點(diǎn)及應(yīng)用掌握備忘錄模式的特點(diǎn)及應(yīng)用掌握訪問(wèn)者模式的特點(diǎn)及應(yīng)用掌握狀態(tài)模式的特點(diǎn)及應(yīng)用掌握解釋器模式的特點(diǎn)及應(yīng)用本章目標(biāo)掌握中介者模式的特點(diǎn)及應(yīng)用中介者模式MediatorPattern用一個(gè)中介對(duì)象封裝一系列對(duì)象(同事)的交互,中介者使各對(duì)象不需要顯式的相互作用,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互中介者模式角色:抽象中介者(Mediator)角色:該角色定義出同事對(duì)象到中介者對(duì)象的統(tǒng)一接口,用于各同事角色之間的通信。具體中介者(ConcreteMediator)角色:該角色實(shí)現(xiàn)抽象中介者,它依賴于各個(gè)同事角色,并通過(guò)協(xié)調(diào)各同事角色實(shí)現(xiàn)協(xié)作行為。抽象同事(Colleague)角色:該角色定義出中介者到同事對(duì)象的接口,同事對(duì)象只知道中介者而不知道其余的同事對(duì)象。具體同事(ConcreteColleague)角色:該角色實(shí)現(xiàn)抽象同事類,每一個(gè)具體同事類都清楚自己在小范圍內(nèi)的行為,而不知道大范圍內(nèi)的目的。3中介者模式MediatorPattern3中介者模式的優(yōu)缺點(diǎn)中介者模式的優(yōu)點(diǎn)減少類間的依賴,將原有的一對(duì)多的依賴變成一對(duì)一的依賴,使得對(duì)象之間的關(guān)系更易維護(hù)和理解。避免同事對(duì)象之間的過(guò)度耦合,同事類只依賴于中介者,使同事類更易被復(fù)用,中介類和同事類可以相對(duì)獨(dú)立地演化。中介者模式將對(duì)象的行為和協(xié)作抽象化,將對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開(kāi)處理。中介者模式的缺點(diǎn)中介者模式降低了同事對(duì)象的復(fù)雜性,但增加了中介者類的復(fù)雜性。中介者類經(jīng)常充滿了各個(gè)具體同事類的關(guān)系協(xié)調(diào)代碼,這種代碼是不能復(fù)用的。4中介者模式的優(yōu)缺點(diǎn)中介者模式的優(yōu)點(diǎn)中介者模式的缺點(diǎn)4中介者模式的注意事項(xiàng)不應(yīng)當(dāng)在責(zé)任劃分混亂時(shí)使用。通常的情況下,一個(gè)初級(jí)設(shè)計(jì)師在面向?qū)ο蟮募夹g(shù)不熟悉時(shí),會(huì)使一個(gè)系統(tǒng)在責(zé)任的分割上發(fā)生混亂。責(zé)任分割的混亂會(huì)使得系統(tǒng)中的對(duì)象與對(duì)象之間產(chǎn)生不適當(dāng)?shù)膹?fù)雜關(guān)系。不應(yīng)當(dāng)對(duì)數(shù)據(jù)類和方法類使用。初級(jí)設(shè)計(jì)師常常會(huì)設(shè)計(jì)出這樣的一種系統(tǒng),讓一系列類只含有數(shù)據(jù),另一些類只含有方法。例如,描述一個(gè)客戶時(shí),這些設(shè)計(jì)師首先設(shè)計(jì)出一個(gè)叫做客戶數(shù)據(jù)的類,只含有客戶數(shù)據(jù);另外再設(shè)計(jì)一個(gè)類叫做“管理類”,含有操作客戶以及此客戶購(gòu)買公司產(chǎn)品、付賬的方法。管理類自然會(huì)涉及到其他的類,諸如產(chǎn)品數(shù)據(jù)類、訂單數(shù)據(jù)類、付賬數(shù)據(jù)類、應(yīng)收帳數(shù)據(jù)類等。這不是一種好的設(shè)計(jì)方式,也不是中介者模式。正確理解封裝。封裝首先是行為,以及行為所涉及的狀態(tài)的封裝。行為與狀態(tài)是不應(yīng)當(dāng)分割開(kāi)來(lái)的。中介者模式的用途是管理很多的對(duì)象的相互作用,以便使這些對(duì)象可以專注于自身的行為。5中介者模式的注意事項(xiàng)不應(yīng)當(dāng)在責(zé)任劃分混亂時(shí)使用。通常的情況下中介者模式實(shí)例publicinterfaceMarriageAgency{voidpair(Personperson);//為person配對(duì)

voidregister(Personperson);//注冊(cè)會(huì)員}publicabstractclassPerson{Stringname;//姓名

intage;//年齡

Sexsex;//性別

intrequestAge;//要求對(duì)象的年齡。對(duì)對(duì)象只有這一個(gè)要求

MarriageAgencyagency;//婚姻中介

publicPerson(Stringname,intage,Sexsex,intrequestAge,MarriageAgencyagency){=name;……agency.register(this);//注冊(cè)會(huì)員

}//尋找對(duì)象

publicvoidfindPartner(){agency.pair(this);}}enumSex{MALE,FEMALE;}publicclassMarriageAgencyImplimplementsMarriageAgency{List<Man>men=newArrayList<Man>();//男會(huì)員

List<Woman>women=newArrayList<Woman>();//女會(huì)員

publicvoidregister(Personperson){if(person.sex==Sex.MALE)men.add((Man)person);elseif(person.sex==Sex.FEMALE)women.add((Woman)person);}publicvoidpair(Personperson){if(person.sex==Sex.MALE){for(Womanw:women)if(w.age==person.requestAge){System.out.println(+"和"++"配對(duì)成功");return;}}elseif(person.sex==Sex.FEMALE){for(Manm:men)if(m.age==person.requestAge){System.out.println(+"和"++"配對(duì)成功");return;}}System.out.println("沒(méi)有為"++"找到合適的對(duì)象");}}publicclassManextendsPerson{publicMan(Stringname,intage,intrequestAge,MarriageAgencyagency){super(name,age,Sex.MALE,requestAge,agency);}}publicclassWomanextendsPerson{publicMan(Stringname,intage,intrequestAge,MarriageAgencyagency){super(name,age,Sex.FAMALE,requestAge,agency);}}publicclassTest{publicstaticvoidmain(String[]args){MarriageAgencyagency=newMarriageAgencyImpl();Personm1=newMan("John",20,18,agency);Personm2=newMan("Mike",27,25,agency);Personw1=newWoman("Mary",25,27,agency);Personw2=newWoman("Jane",20,22,agency);

m1.findPartner();m2.findPartner();}}6中介者模式實(shí)例publicinterfaceMarria觀察者模式ObserverPattern定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新觀察者模式角色:抽象主題(Subject)角色:該角色又稱為“被觀察者”,可以增加和刪除觀察者對(duì)象。抽象觀察者(Observer)角色:該角色為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。具體主題(ConcreteSubject)角色:該角色又稱為“具體被觀察者”,它將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體觀察者(ConcreteObserver)角色:該角色實(shí)現(xiàn)抽象觀察者所要求的更新接口,以便使自身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。7觀察者模式ObserverPattern7觀察者模式的優(yōu)點(diǎn)觀察者模式的優(yōu)點(diǎn)觀察者和被觀察者之間是抽象耦合。被觀察者角色所知道的只是一個(gè)具體觀察者集合,每一個(gè)具體觀察者都符合一個(gè)抽象觀察者的接口。被觀察者并不認(rèn)識(shí)任何一個(gè)具體的觀察者,它只知道它們都有一個(gè)共同的接口。由于被觀察者和觀察者沒(méi)有緊密的耦合在一起,因此它們可以屬于不同的抽象化層次,且都非常容易擴(kuò)展。支持廣播通信。被觀察者會(huì)向所有的登記過(guò)的觀察者發(fā)出通知,這就是一個(gè)觸發(fā)機(jī)制,形成一個(gè)觸發(fā)鏈。8觀察者模式的優(yōu)點(diǎn)觀察者模式的優(yōu)點(diǎn)8觀察者模式的缺點(diǎn)觀察者模式的缺點(diǎn)如果一個(gè)主題有多個(gè)直接或間接的觀察者,則通知所有的觀察者會(huì)花費(fèi)很多時(shí)間,且開(kāi)發(fā)和調(diào)試都比較復(fù)雜。如果在主題之間有循環(huán)依賴的話,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察者模式時(shí)要特別注意這一點(diǎn)。如果對(duì)觀察者的通知是通過(guò)另外的線程進(jìn)行異步投遞的話,系統(tǒng)必須保證投遞的順序執(zhí)行。雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對(duì)象發(fā)生了變化,但是觀察者模式?jīng)]有提供相應(yīng)的機(jī)制使觀察者知道所觀察的對(duì)象是怎么發(fā)生變化。9觀察者模式的缺點(diǎn)觀察者模式的缺點(diǎn)9觀察者模式的應(yīng)用場(chǎng)景和注意事項(xiàng)觀察者模式的應(yīng)用場(chǎng)景關(guān)聯(lián)行為場(chǎng)景。事件多級(jí)觸發(fā)場(chǎng)景??缦到y(tǒng)的消息交換場(chǎng)景,如消息隊(duì)列的處理機(jī)制。

觀察者模式的注意事項(xiàng)廣播鏈的問(wèn)題。一個(gè)觀察者可以有雙重身份,既是觀察者也是被觀察者,廣播鏈一旦建立,邏輯就比較復(fù)雜,可維護(hù)性非常差。一般在一個(gè)觀察者模式中最多出現(xiàn)一個(gè)對(duì)象既是觀察者也是被觀察者,這樣消息最多轉(zhuǎn)發(fā)一次(傳遞兩次),較易控制。異步處理的問(wèn)題。異步處理就要考慮線程安全和隊(duì)列的問(wèn)題。10觀察者模式的應(yīng)用場(chǎng)景和注意事項(xiàng)觀察者模式的應(yīng)用場(chǎng)景觀察者模式觀察者模式實(shí)例publicinterfaceClickable{//點(diǎn)擊

voidclick();//添加點(diǎn)擊事件的觀察者

voidaddClickableObserver(ClickableObserverobserver);//移除點(diǎn)擊事件的觀察者

voidremoveClickableObserver(ClickableObserverobserver);}publicinterfaceClickableObserver{//發(fā)生點(diǎn)擊事件時(shí)的操作

voidclicked(Clickableclickable);}publicclassButtonimplementsClickable{//存儲(chǔ)注冊(cè)過(guò)的點(diǎn)擊事件觀察者

List<ClickableObserver>observers=newArrayList<ClickableObserver>();//按鈕信息

Stringcolor;//顏色

intx,y;//坐標(biāo)

publicvoidclick(){System.out.println("按鈕被點(diǎn)擊");//執(zhí)行所有觀察者的事件處理方法

for(inti=observers.size()-1;i>=0;i--)observers.get(i).clicked(this);}publicvoidaddClickableObserver(ClickableObserverobserver){observers.add(observer);}publicvoidremoveClickableObserver(ClickableObserverobserver){observers.remove(observer);}publicStringtoString(){return"按鈕顏色:"+color+",坐標(biāo):"+x+","+y;}}publicclassChangeColorObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){Buttonb=(Button)clickable;b.color="紅色";}}publicclassChangeCoordinateObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){Buttonb=(Button)clickable;b.x=100;b.y=90;}}publicclassOtherObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){System.out.println("執(zhí)行其它操作......");}}publicclassTest{publicstaticvoidmain(String[]args){Buttonbutton=newButton();button.color="白色";button.x=0;button.y=0;button.addClickableObserver(newChangeColorObserver());button.addClickableObserver(newChangeCoordinateObserver());button.addClickableObserver(newOtherObserver());button.click();System.out.println(button);}}11觀察者模式實(shí)例publicinterfaceClicka備忘錄模式MementoPattern在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)備忘錄模式角色:發(fā)起人(Originator)角色:該角色記錄當(dāng)前時(shí)刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于備份范圍的狀態(tài),負(fù)責(zé)創(chuàng)建和恢復(fù)備忘數(shù)據(jù)。備忘錄(Memento)角色:該角色負(fù)責(zé)存儲(chǔ)發(fā)起人角色的內(nèi)部狀態(tài),在需要時(shí)提供發(fā)起人需要的內(nèi)部狀態(tài)數(shù)據(jù)。負(fù)責(zé)人(Caretaker)角色:該角色對(duì)備忘錄角色進(jìn)行管理、保存和提供備忘錄。12備忘錄模式MementoPattern12備忘錄模式的應(yīng)用場(chǎng)景和注意事項(xiàng)備忘錄模式的應(yīng)用場(chǎng)景需要保存和恢復(fù)數(shù)據(jù)的相關(guān)狀態(tài)場(chǎng)景。提供一個(gè)可回滾的操作。需要監(jiān)控副本的場(chǎng)景中。例如,監(jiān)控一個(gè)對(duì)象的屬性,但是監(jiān)控又不應(yīng)該作為系統(tǒng)的主業(yè)務(wù)來(lái)調(diào)用,它只是邊緣應(yīng)用,即使出現(xiàn)監(jiān)控不準(zhǔn)、錯(cuò)誤報(bào)警也影響不大,因此一般做法是備份一個(gè)主線程中的對(duì)象,然后由分析程序來(lái)分析。數(shù)據(jù)庫(kù)連接的事務(wù)管理使用的就是備忘錄模式。備忘錄模式的注意事項(xiàng)備忘錄的生命周期,備忘錄創(chuàng)建出來(lái)就要在最近的代碼中使用,要主動(dòng)管理它的生命周期,建立就要使用,不使用就要立刻刪除其引用,等待垃圾回收器對(duì)它的回收處理。備忘錄的性能。不要在頻繁建立備份的場(chǎng)景中使用備忘錄模式,例如for循環(huán)中,一是控制不了備忘錄建立的對(duì)象數(shù)量;二是大對(duì)象的建立是要消耗資源的。系統(tǒng)的性能需要考慮。因此,如果出現(xiàn)這樣的代碼,設(shè)計(jì)師應(yīng)該修改架構(gòu)。13備忘錄模式的應(yīng)用場(chǎng)景和注意事項(xiàng)備忘錄模式的應(yīng)用場(chǎng)景備忘錄模式備忘錄模式實(shí)例publicclassDocument{Stringcontent;//需備份的狀態(tài)

StringotherContent;//無(wú)需備份的狀態(tài)

//保存為一個(gè)備份

publicBackupsave(){System.out.println("保存?zhèn)浞?);returnnewBackup(content);}//恢復(fù)為某個(gè)狀態(tài)

publicvoidresume(Backupbackup){System.out.println("恢復(fù)備份");content=backup.content;}@OverridepublicStringtoString(){return"content:"+content+",otherContent:"+otherContent;}}publicclassBackup{Stringcontent;//備份的內(nèi)容

intversion;//版本

publicBackup(Stringcontent){this.content=content;}}publicclassVersionControlSystem{LinkedList<Backup>backups=newLinkedList<Backup>();//所有的備份

intnextVersion;//下一個(gè)版本

//添加備份

publicvoidadd(Backupbackup){backup.version=++nextVersion;backups.add(backup);}//取得某個(gè)版本的備份

publicBackupget(intversion){for(Backupbackup:backups)if(backup.version==version)returnbackup;returnnull;}//取得最后一個(gè)版本的備份

publicBackupgetLastVersion(){returnbackups.getLast();}}publicclassTest{publicstaticvoidmain(String[]args){

VersionControlSystemvcs=newVersionControlSystem();Documentdocument=newDocument();document.content="content1";document.otherContent="otherContent1";System.out.println(document);vcs.add(document.save());//保存?zhèn)浞?/p>

document.content="content2";document.otherContent="otherContent2";System.out.println(document);vcs.add(document.save());//保存?zhèn)浞?/p>

document.content="content3";document.otherContent="otherContent3";System.out.println(document);document.resume(vcs.get(1));//恢復(fù)版本1System.out.println(document);document.resume(vcs.getLastVersion());//恢復(fù)最新版本

System.out.println(document);}}14備忘錄模式實(shí)例publicclassDocument{訪問(wèn)者模式VisitorPattern封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作訪問(wèn)者模式角色:抽象訪問(wèn)者(Visitor)角色:該角色聲明一個(gè)或多個(gè)訪問(wèn)操作,定義訪問(wèn)者可以訪問(wèn)哪些元素。具體訪問(wèn)者(ConcreteVisitor)角色:該角色實(shí)現(xiàn)抽象訪問(wèn)者角色中的各個(gè)訪問(wèn)操作。抽象元素(Element)角色:該角色聲明一個(gè)接受操作,接受一個(gè)訪問(wèn)者對(duì)象。具體元素(ConcreteElement)角色:該角色實(shí)現(xiàn)抽象元素中的接受操作。結(jié)構(gòu)對(duì)象(ObjectStructure)角色:該角色有以下責(zé)任,可以遍歷結(jié)構(gòu)中的所有元素;如果需要,提供一個(gè)高層次的接口讓訪問(wèn)者對(duì)象可以訪問(wèn)每一個(gè)元素,也可以設(shè)計(jì)一個(gè)復(fù)合對(duì)象或者一個(gè)集合,如List或Set。15訪問(wèn)者模式VisitorPattern15訪問(wèn)者模式的優(yōu)點(diǎn)訪問(wèn)者模式的優(yōu)點(diǎn)訪問(wèn)者模式使得增加新的操作變得很容易,增加新的操作只需增加新的訪問(wèn)者類。訪問(wèn)者模式將有關(guān)的行為集中到一個(gè)訪問(wèn)者對(duì)象中,而不是分散到一個(gè)個(gè)元素類中。訪問(wèn)者模式可以跨過(guò)幾個(gè)類的等級(jí)結(jié)構(gòu)訪問(wèn)屬于不同的等級(jí)結(jié)構(gòu)的成員類。累積狀態(tài)。每一個(gè)單獨(dú)的訪問(wèn)者對(duì)象都集中了相關(guān)的行為,從而也就可以在訪問(wèn)的過(guò)程中將執(zhí)行操作的狀態(tài)積累在自己內(nèi)部,而不是分散到很多的元素對(duì)象中,益于系統(tǒng)的維護(hù)。16訪問(wèn)者模式的優(yōu)點(diǎn)訪問(wèn)者模式的優(yōu)點(diǎn)16訪問(wèn)者模式的缺點(diǎn)訪問(wèn)者模式的缺點(diǎn)增加新的元素類變得很困難。每增加一個(gè)新的元素類都意味著要在抽象訪問(wèn)者角色中增加一個(gè)新的抽象操作,并在每一個(gè)具體訪問(wèn)者類中增加相應(yīng)的具體操作。破壞封裝。訪問(wèn)者模式要求訪問(wèn)者對(duì)象訪問(wèn)并調(diào)用每一個(gè)元素對(duì)象的操作,這隱含了一個(gè)對(duì)所有元素對(duì)象的要求,即必須暴露一些自己的操作和內(nèi)部狀態(tài),否則訪問(wèn)者的訪問(wèn)就變得沒(méi)有意義。由于訪問(wèn)者對(duì)象自己會(huì)積累訪問(wèn)操作所需的狀態(tài),從而使得這些狀態(tài)不再存儲(chǔ)在元素對(duì)象中,破壞了類的封裝性。違背了依賴倒置原則。訪問(wèn)者依賴的是具體的元素,而不是抽象的元素,這破壞了依賴倒置的原則,特別是在面向?qū)ο蟮木幊讨校瑨仐壛藢?duì)接口的依賴,而直接依賴實(shí)現(xiàn)類,擴(kuò)展比較難。17訪問(wèn)者模式的缺點(diǎn)訪問(wèn)者模式的缺點(diǎn)17訪問(wèn)者模式的應(yīng)用場(chǎng)景訪問(wèn)者模式的應(yīng)用場(chǎng)景一個(gè)對(duì)象結(jié)構(gòu)包含很多類對(duì)象,它們有不同的接口,當(dāng)對(duì)這些對(duì)象實(shí)施依賴于具體類的操作時(shí),即使用迭代器模式不能勝任的場(chǎng)景下,可以采用訪問(wèn)者模式。需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同并且不相關(guān)的操作,避免操作污染類。業(yè)務(wù)規(guī)則要求遍歷多個(gè)不同的對(duì)象,這本身也是訪問(wèn)者模式的出發(fā)點(diǎn),迭代器模式只能訪問(wèn)同類或同接口的數(shù)據(jù),而訪問(wèn)者模式是對(duì)迭代器模式的擴(kuò)充,可以遍歷不同的對(duì)象,執(zhí)行不同的操作。18訪問(wèn)者模式的應(yīng)用場(chǎng)景訪問(wèn)者模式的應(yīng)用場(chǎng)景18訪問(wèn)者模式實(shí)例publicabstractclassHardware{Stringtype;//型號(hào)

publicHardware(Stringtype){this.type=type;}publicStringgetType(){returntype;}//運(yùn)轉(zhuǎn)

publicabstractvoidrun();//接受計(jì)算機(jī)訪問(wèn)者

publicabstractvoidaccept(ComputerVisitorcomputerVisitor);}publicinterfaceComputerVisitor{voidvistCPU(CPUcpu);//訪問(wèn)CPUvoidvistHarddisk(Harddiskharddisk);//訪問(wèn)硬盤}publicclassCPUextendsHardware{publicCPU(Stringtype){super(type);}publicvoidrun(){System.out.println("型號(hào)為"+type+"的CPU正在運(yùn)轉(zhuǎn)");

}publicvoidaccept(ComputerVisitorcomputerVisitor){computerVisitor.vistCPU(this);}}publicclassHarddiskextendsHardware{publicHarddisk(Stringtype){super(type);}publicvoidrun(){System.out.println("型號(hào)為"+type+"的硬盤正在運(yùn)轉(zhuǎn)");}publicvoidaccept(ComputerVisitorcomputerVisitor){computerVisitor.vistHarddisk(this);}}publicclassTypeVisitorimplementsComputerVisitor{publicvoidvistCPU(CPUcpu){

System.out.println("CPU型號(hào):"+cpu.getType());}publicvoidvistHarddisk(Harddiskharddisk){System.out.println("硬盤型號(hào):"+harddisk.getType());}}publicclassRunVisitorimplementsComputerVisitor{publicvoidvistCPU(CPUcpu){

cpu.run();}publicvoidvistHarddisk(Harddiskharddisk){

harddisk.run();}}publicclassComputer{privateHardwarecpu;privateHardwareharddisk;

publicComputer(){this.cpu=newCPU("IntelCorei7-620");this.harddisk=newHarddisk("Seagate500G7200轉(zhuǎn)");}

publicvoidaccept(ComputerVisitorcomputerVisitor){cpu.accept(computerVisitor);harddisk.accept(computerVisitor);}}publicclassClientDemo{publicstaticvoidmain(String[]args){Computercomputer=newComputer();ComputerVisitortypeVisitor=newTypeVisitor();ComputerVisitorrunVisitor=newRunVisitor();computer.accept(typeVisitor);System.out.println("-----------------");computer.accept(runVisitor);}}19訪問(wèn)者模式實(shí)例publicabstractclassH狀態(tài)模式StatePattern當(dāng)一個(gè)對(duì)象內(nèi)在狀態(tài)改變時(shí)允許改變行為,這個(gè)對(duì)象看起來(lái)像改變了其類型狀態(tài)模式3個(gè)角色:抽象狀態(tài)(State)角色:該角色用以封裝環(huán)境對(duì)象的一個(gè)特定的狀態(tài)所對(duì)應(yīng)的行為。具體狀態(tài)(ConcreteState)角色:該角色實(shí)現(xiàn)環(huán)境的一個(gè)狀態(tài)所對(duì)應(yīng)的行為。環(huán)境(Context)角色:該角色定義客戶端需要的接口,并負(fù)責(zé)具體狀態(tài)的切換。它會(huì)保留一個(gè)具體狀態(tài)類的實(shí)例,該實(shí)例給出環(huán)境對(duì)象的現(xiàn)有狀態(tài)。20狀態(tài)模式StatePattern20狀態(tài)模式的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景狀態(tài)模式的優(yōu)點(diǎn)結(jié)構(gòu)清晰。遵循設(shè)計(jì)原則。封裝性非常好。狀態(tài)模式的應(yīng)用場(chǎng)景對(duì)象的行為依賴于它所處的狀態(tài),即行為隨狀態(tài)改變而改變的場(chǎng)景。對(duì)象在某個(gè)方法里依賴于一重或多重條件分支語(yǔ)句,此時(shí)可以使用狀態(tài)模式將分支語(yǔ)句中的每一個(gè)分支都包裝到一個(gè)單獨(dú)的類中,使得這些條件分支語(yǔ)句能夠以類的方式獨(dú)立存在和演化。如此,維護(hù)這些獨(dú)立的類就不再影響到系統(tǒng)的其他部分。狀態(tài)模式的缺點(diǎn)子類太多,不易管理21狀態(tài)模式的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景狀態(tài)模式的優(yōu)點(diǎn)狀態(tài)模式的應(yīng)用場(chǎng)景狀狀態(tài)模式實(shí)例//頻道(抽象狀態(tài))publicinterfaceChannel{//播放頻道中的節(jié)目

publicvoiddisplay();}publicclassCCTV1implementsChannel{publicvoiddisplay(){System.out.println("CCTV1新聞聯(lián)播");}}publicclassCCTV2implementsChannel{publicvoiddisplay(){System.out.println(“CCTV2經(jīng)濟(jì)半小時(shí)");}}publicclassCCTV3implementsChannel{publicvoiddisplay(){System.out.println(“CCTV3非常6+1");}}//電視publicclassTV{//電視可以看的頻道(狀態(tài))

publicfinalstaticChannelCCTV1=newCCTV1();publicfinalstaticChannelCCTV2=newCCTV2();publicfinalstaticChannelCCTV3=newCCTV3();privateChannelchannel;//當(dāng)前頻道publicvoidsetChannel(Channelchannel){this.channel=channel;//設(shè)置頻道}publicvoiddisCCTV1(){this.setChannel(CCTV1);//播放CCTV1頻道this.channel.display();}publicvoiddisCCTV2(){this.setChannel(CCTV2);//播放CCTV2頻道this.channel.display();}publicvoiddisCCTV3(){this.setChannel(CCTV3);//播放CCTV3頻道this.channel.display();}}publicclassTest{publicstaticvoidmain(String[]args){TVtv=newTV();//換臺(tái)

tv.disCCTV2();tv.disCCTV3();tv.disCCTV1();}}22狀態(tài)模式實(shí)例//頻道(抽象狀態(tài))publicclass解釋器模式InterpreterPattern給定一門語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子解釋器模式5個(gè)角色:抽象表達(dá)式(AbstractExpression)角色:該角色聲明一個(gè)所有的具體表達(dá)式角色都需要實(shí)現(xiàn)的抽象接口,該接口主要是一個(gè)解釋操作interpret()方法。終結(jié)符表達(dá)式(TerminalExpression)角色:該角色實(shí)現(xiàn)了抽象表達(dá)式角色所要求的接口,文法中的每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)。非終結(jié)符表達(dá)式(NonterminalExpression)角色:該角色是一個(gè)具體角色,文法中的每一條規(guī)則都對(duì)應(yīng)一個(gè)非終結(jié)符表達(dá)式類。環(huán)境(Context)角色:該角色提供解釋器之外的一些全局信息。客戶端(Client)角色:該角色創(chuàng)建一個(gè)抽象語(yǔ)法樹,調(diào)用解釋操作。23解釋器模式InterpreterPattern23解釋器模式的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景解釋器模式的優(yōu)點(diǎn)簡(jiǎn)單的語(yǔ)法分析工具。擴(kuò)展性,修改語(yǔ)法規(guī)則只要修改相應(yīng)的非終結(jié)符表達(dá)式即可,若擴(kuò)展語(yǔ)法,則只要增加非終結(jié)符類即可。解釋器模式的應(yīng)用場(chǎng)景重復(fù)發(fā)生的問(wèn)題可以使用解釋器模式。一個(gè)簡(jiǎn)單語(yǔ)法需要解釋的場(chǎng)景。解釋器模式的缺點(diǎn)解釋器模式會(huì)引起類膨脹可能存在大量遞歸24解釋器模式的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景解釋器模式的優(yōu)點(diǎn)解釋器模式的應(yīng)用解釋器模式實(shí)例publicinterfaceArithmeticExpression{intinterpret(Variablesvariables);}publicclassVariableimplementsArithmeticExpression{@Override

publicintinterpret(Variablesvariables){returnvariables.get(this);}}publicclassVariables{Map<Variable,Integer>v=newHashMap<Variable,Integer>();publicvoidput(Variablevariable,intvalue){v.put(variable,value);}publicintget(Variablevariable){returnv.get(variable);}}publicclassPlusimplementsArithmeticExpression{ArithmeticExpressionleft,

right;publicPlus(ArithmeticExpressionleft,ArithmeticExpressionright){this.left=left;this.right=right;}publicintinterpret(Variablesvariables){

erpret(variables)+erpret(variables);}}publicclassSubtractimplementsArithmeticExpression{ArithmeticExpressionleft,

right;publicSubtract(ArithmeticExpressionleft,ArithmeticExpressionright){this.left=left;this.right=right;}publicintinterpret(Variablesvariables){

erpret(variables)-erpret(variables);}}publicclassDivisionimplementsArithmeticExpression{ArithmeticExpressionleft,

right;publicDivision(ArithmeticExpressionleft,ArithmeticExpressionright){this.left=left;this.right=right;}publicintinterpret(Variablesvariables){

erpret(variables)/erpret(variables);}}publicclassMultiplyimplementsArithmeticExpression{ArithmeticExpressionleft,

right;publicMultiply(ArithmeticExpressionleft,ArithmeticExpressionright){this.left=left;this.right=right;}publicintinterpret(Variablesvariables){

erpret(variables)*erpret(variables);}}publicclassClientDemo{publicstaticvoidmain(String[]args){Variablesv=newVariables();Variablex=newVariable();Variabley=newVariable();Variablez=newVariable();

v.put(x,10);v.put(y,20);

v.put(z,30);//計(jì)算x*(y+z/x)-xArithmeticExpressione=newSubtract(newMultiply(x,newPlus(y,newDivision(z,x))),x);

System.out.println(erpret(v));//220

}}25解釋器模式實(shí)例publicinterfaceArithm小結(jié)中介者模式(Mediator)也稱調(diào)停者模式,用一個(gè)中介對(duì)象封裝一系列對(duì)象(同事)的交互,中介者使各對(duì)象不需要顯式的相互作用,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互觀察者模式(ObserverPattern)也稱發(fā)布訂閱模式,定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新備忘錄模式(MementoPattern)又稱為快照(Snapshot)模式或Token模式,在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)訪問(wèn)者模式(VisitorPattern)封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作狀態(tài)模式(StatePattern)又稱為狀態(tài)對(duì)象模式,當(dāng)一個(gè)對(duì)象內(nèi)在狀態(tài)改變時(shí)允許改變行為,這個(gè)對(duì)象看起來(lái)像改變了其類型解釋器模式(InterpreterPattern)給定一門語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子26小結(jié)中介者模式(Mediator)也稱調(diào)停者模式,用一個(gè)中介謝謝!27謝謝!27第6章行為型模式(2)第6章行為型模式(2)本章目標(biāo)掌握中介者模式的特點(diǎn)及應(yīng)用掌握觀察者模式的特點(diǎn)及應(yīng)用掌握備忘錄模式的特點(diǎn)及應(yīng)用掌握訪問(wèn)者模式的特點(diǎn)及應(yīng)用掌握狀態(tài)模式的特點(diǎn)及應(yīng)用掌握解釋器模式的特點(diǎn)及應(yīng)用本章目標(biāo)掌握中介者模式的特點(diǎn)及應(yīng)用中介者模式MediatorPattern用一個(gè)中介對(duì)象封裝一系列對(duì)象(同事)的交互,中介者使各對(duì)象不需要顯式的相互作用,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互中介者模式角色:抽象中介者(Mediator)角色:該角色定義出同事對(duì)象到中介者對(duì)象的統(tǒng)一接口,用于各同事角色之間的通信。具體中介者(ConcreteMediator)角色:該角色實(shí)現(xiàn)抽象中介者,它依賴于各個(gè)同事角色,并通過(guò)協(xié)調(diào)各同事角色實(shí)現(xiàn)協(xié)作行為。抽象同事(Colleague)角色:該角色定義出中介者到同事對(duì)象的接口,同事對(duì)象只知道中介者而不知道其余的同事對(duì)象。具體同事(ConcreteColleague)角色:該角色實(shí)現(xiàn)抽象同事類,每一個(gè)具體同事類都清楚自己在小范圍內(nèi)的行為,而不知道大范圍內(nèi)的目的。30中介者模式MediatorPattern3中介者模式的優(yōu)缺點(diǎn)中介者模式的優(yōu)點(diǎn)減少類間的依賴,將原有的一對(duì)多的依賴變成一對(duì)一的依賴,使得對(duì)象之間的關(guān)系更易維護(hù)和理解。避免同事對(duì)象之間的過(guò)度耦合,同事類只依賴于中介者,使同事類更易被復(fù)用,中介類和同事類可以相對(duì)獨(dú)立地演化。中介者模式將對(duì)象的行為和協(xié)作抽象化,將對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開(kāi)處理。中介者模式的缺點(diǎn)中介者模式降低了同事對(duì)象的復(fù)雜性,但增加了中介者類的復(fù)雜性。中介者類經(jīng)常充滿了各個(gè)具體同事類的關(guān)系協(xié)調(diào)代碼,這種代碼是不能復(fù)用的。31中介者模式的優(yōu)缺點(diǎn)中介者模式的優(yōu)點(diǎn)中介者模式的缺點(diǎn)4中介者模式的注意事項(xiàng)不應(yīng)當(dāng)在責(zé)任劃分混亂時(shí)使用。通常的情況下,一個(gè)初級(jí)設(shè)計(jì)師在面向?qū)ο蟮募夹g(shù)不熟悉時(shí),會(huì)使一個(gè)系統(tǒng)在責(zé)任的分割上發(fā)生混亂。責(zé)任分割的混亂會(huì)使得系統(tǒng)中的對(duì)象與對(duì)象之間產(chǎn)生不適當(dāng)?shù)膹?fù)雜關(guān)系。不應(yīng)當(dāng)對(duì)數(shù)據(jù)類和方法類使用。初級(jí)設(shè)計(jì)師常常會(huì)設(shè)計(jì)出這樣的一種系統(tǒng),讓一系列類只含有數(shù)據(jù),另一些類只含有方法。例如,描述一個(gè)客戶時(shí),這些設(shè)計(jì)師首先設(shè)計(jì)出一個(gè)叫做客戶數(shù)據(jù)的類,只含有客戶數(shù)據(jù);另外再設(shè)計(jì)一個(gè)類叫做“管理類”,含有操作客戶以及此客戶購(gòu)買公司產(chǎn)品、付賬的方法。管理類自然會(huì)涉及到其他的類,諸如產(chǎn)品數(shù)據(jù)類、訂單數(shù)據(jù)類、付賬數(shù)據(jù)類、應(yīng)收帳數(shù)據(jù)類等。這不是一種好的設(shè)計(jì)方式,也不是中介者模式。正確理解封裝。封裝首先是行為,以及行為所涉及的狀態(tài)的封裝。行為與狀態(tài)是不應(yīng)當(dāng)分割開(kāi)來(lái)的。中介者模式的用途是管理很多的對(duì)象的相互作用,以便使這些對(duì)象可以專注于自身的行為。32中介者模式的注意事項(xiàng)不應(yīng)當(dāng)在責(zé)任劃分混亂時(shí)使用。通常的情況下中介者模式實(shí)例publicinterfaceMarriageAgency{voidpair(Personperson);//為person配對(duì)

voidregister(Personperson);//注冊(cè)會(huì)員}publicabstractclassPerson{Stringname;//姓名

intage;//年齡

Sexsex;//性別

intrequestAge;//要求對(duì)象的年齡。對(duì)對(duì)象只有這一個(gè)要求

MarriageAgencyagency;//婚姻中介

publicPerson(Stringname,intage,Sexsex,intrequestAge,MarriageAgencyagency){=name;……agency.register(this);//注冊(cè)會(huì)員

}//尋找對(duì)象

publicvoidfindPartner(){agency.pair(this);}}enumSex{MALE,FEMALE;}publicclassMarriageAgencyImplimplementsMarriageAgency{List<Man>men=newArrayList<Man>();//男會(huì)員

List<Woman>women=newArrayList<Woman>();//女會(huì)員

publicvoidregister(Personperson){if(person.sex==Sex.MALE)men.add((Man)person);elseif(person.sex==Sex.FEMALE)women.add((Woman)person);}publicvoidpair(Personperson){if(person.sex==Sex.MALE){for(Womanw:women)if(w.age==person.requestAge){System.out.println(+"和"++"配對(duì)成功");return;}}elseif(person.sex==Sex.FEMALE){for(Manm:men)if(m.age==person.requestAge){System.out.println(+"和"++"配對(duì)成功");return;}}System.out.println("沒(méi)有為"++"找到合適的對(duì)象");}}publicclassManextendsPerson{publicMan(Stringname,intage,intrequestAge,MarriageAgencyagency){super(name,age,Sex.MALE,requestAge,agency);}}publicclassWomanextendsPerson{publicMan(Stringname,intage,intrequestAge,MarriageAgencyagency){super(name,age,Sex.FAMALE,requestAge,agency);}}publicclassTest{publicstaticvoidmain(String[]args){MarriageAgencyagency=newMarriageAgencyImpl();Personm1=newMan("John",20,18,agency);Personm2=newMan("Mike",27,25,agency);Personw1=newWoman("Mary",25,27,agency);Personw2=newWoman("Jane",20,22,agency);

m1.findPartner();m2.findPartner();}}33中介者模式實(shí)例publicinterfaceMarria觀察者模式ObserverPattern定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新觀察者模式角色:抽象主題(Subject)角色:該角色又稱為“被觀察者”,可以增加和刪除觀察者對(duì)象。抽象觀察者(Observer)角色:該角色為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。具體主題(ConcreteSubject)角色:該角色又稱為“具體被觀察者”,它將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體觀察者(ConcreteObserver)角色:該角色實(shí)現(xiàn)抽象觀察者所要求的更新接口,以便使自身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。34觀察者模式ObserverPattern7觀察者模式的優(yōu)點(diǎn)觀察者模式的優(yōu)點(diǎn)觀察者和被觀察者之間是抽象耦合。被觀察者角色所知道的只是一個(gè)具體觀察者集合,每一個(gè)具體觀察者都符合一個(gè)抽象觀察者的接口。被觀察者并不認(rèn)識(shí)任何一個(gè)具體的觀察者,它只知道它們都有一個(gè)共同的接口。由于被觀察者和觀察者沒(méi)有緊密的耦合在一起,因此它們可以屬于不同的抽象化層次,且都非常容易擴(kuò)展。支持廣播通信。被觀察者會(huì)向所有的登記過(guò)的觀察者發(fā)出通知,這就是一個(gè)觸發(fā)機(jī)制,形成一個(gè)觸發(fā)鏈。35觀察者模式的優(yōu)點(diǎn)觀察者模式的優(yōu)點(diǎn)8觀察者模式的缺點(diǎn)觀察者模式的缺點(diǎn)如果一個(gè)主題有多個(gè)直接或間接的觀察者,則通知所有的觀察者會(huì)花費(fèi)很多時(shí)間,且開(kāi)發(fā)和調(diào)試都比較復(fù)雜。如果在主題之間有循環(huán)依賴的話,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察者模式時(shí)要特別注意這一點(diǎn)。如果對(duì)觀察者的通知是通過(guò)另外的線程進(jìn)行異步投遞的話,系統(tǒng)必須保證投遞的順序執(zhí)行。雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對(duì)象發(fā)生了變化,但是觀察者模式?jīng)]有提供相應(yīng)的機(jī)制使觀察者知道所觀察的對(duì)象是怎么發(fā)生變化。36觀察者模式的缺點(diǎn)觀察者模式的缺點(diǎn)9觀察者模式的應(yīng)用場(chǎng)景和注意事項(xiàng)觀察者模式的應(yīng)用場(chǎng)景關(guān)聯(lián)行為場(chǎng)景。事件多級(jí)觸發(fā)場(chǎng)景??缦到y(tǒng)的消息交換場(chǎng)景,如消息隊(duì)列的處理機(jī)制。

觀察者模式的注意事項(xiàng)廣播鏈的問(wèn)題。一個(gè)觀察者可以有雙重身份,既是觀察者也是被觀察者,廣播鏈一旦建立,邏輯就比較復(fù)雜,可維護(hù)性非常差。一般在一個(gè)觀察者模式中最多出現(xiàn)一個(gè)對(duì)象既是觀察者也是被觀察者,這樣消息最多轉(zhuǎn)發(fā)一次(傳遞兩次),較易控制。異步處理的問(wèn)題。異步處理就要考慮線程安全和隊(duì)列的問(wèn)題。37觀察者模式的應(yīng)用場(chǎng)景和注意事項(xiàng)觀察者模式的應(yīng)用場(chǎng)景觀察者模式觀察者模式實(shí)例publicinterfaceClickable{//點(diǎn)擊

voidclick();//添加點(diǎn)擊事件的觀察者

voidaddClickableObserver(ClickableObserverobserver);//移除點(diǎn)擊事件的觀察者

voidremoveClickableObserver(ClickableObserverobserver);}publicinterfaceClickableObserver{//發(fā)生點(diǎn)擊事件時(shí)的操作

voidclicked(Clickableclickable);}publicclassButtonimplementsClickable{//存儲(chǔ)注冊(cè)過(guò)的點(diǎn)擊事件觀察者

List<ClickableObserver>observers=newArrayList<ClickableObserver>();//按鈕信息

Stringcolor;//顏色

intx,y;//坐標(biāo)

publicvoidclick(){System.out.println("按鈕被點(diǎn)擊");//執(zhí)行所有觀察者的事件處理方法

for(inti=observers.size()-1;i>=0;i--)observers.get(i).clicked(this);}publicvoidaddClickableObserver(ClickableObserverobserver){observers.add(observer);}publicvoidremoveClickableObserver(ClickableObserverobserver){observers.remove(observer);}publicStringtoString(){return"按鈕顏色:"+color+",坐標(biāo):"+x+","+y;}}publicclassChangeColorObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){Buttonb=(Button)clickable;b.color="紅色";}}publicclassChangeCoordinateObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){Buttonb=(Button)clickable;b.x=100;b.y=90;}}publicclassOtherObserverimplementsClickableObserver{@Overridepublicvoidclicked(Clickableclickable){System.out.println("執(zhí)行其它操作......");}}publicclassTest{publicstaticvoidmain(String[]args){Buttonbutton=newButton();button.color="白色";button.x=0;button.y=0;button.addClickableObserver(newChangeColorObserver());button.addClickableObserver(newChangeCoordinateObserver());button.addClickableObserver(newOtherObserver());button.click();System.out.println(button);}}38觀察者模式實(shí)例publicinterfaceClicka備忘錄模式MementoPattern在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)備忘錄模式角色:發(fā)起人(Originator)角色:該角色記錄當(dāng)前時(shí)刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于備份范圍的狀態(tài),負(fù)責(zé)創(chuàng)建和恢復(fù)備忘數(shù)據(jù)。備忘錄(Memento)角色:該角色負(fù)責(zé)存儲(chǔ)發(fā)起人角色的內(nèi)部狀態(tài),在需要時(shí)提供發(fā)起人需要的內(nèi)部狀態(tài)數(shù)據(jù)。負(fù)責(zé)人(Caretaker)角色:該角色對(duì)備忘錄角色進(jìn)行管理、保存和提供備忘錄。39備忘錄模式MementoPattern12備忘錄模式的應(yīng)用場(chǎng)景和注意事項(xiàng)備忘錄模式的應(yīng)用場(chǎng)景需要保存和恢復(fù)數(shù)據(jù)的相關(guān)狀態(tài)場(chǎng)景。提供一個(gè)可回滾的操作。需要監(jiān)控副本的場(chǎng)景中。例如,監(jiān)控一個(gè)對(duì)象的屬性,但是監(jiān)控又不應(yīng)該作為系統(tǒng)的主業(yè)務(wù)來(lái)調(diào)用,它只是邊緣應(yīng)用,即使出現(xiàn)監(jiān)控不準(zhǔn)、錯(cuò)誤報(bào)警也影響不大,因此一般做法是備份一個(gè)主線程中的對(duì)象,然后由分析程序來(lái)分析。數(shù)據(jù)庫(kù)連接的事務(wù)管理使用的就是備忘錄模式。備忘錄模式的注意事項(xiàng)備忘錄的生命周期,備忘錄創(chuàng)建出來(lái)就要在最近的代碼中使用,要主動(dò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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論