第15章責任鏈模式(ChainofResponsibilityPattern)課件_第1頁
第15章責任鏈模式(ChainofResponsibilityPattern)課件_第2頁
第15章責任鏈模式(ChainofResponsibilityPattern)課件_第3頁
第15章責任鏈模式(ChainofResponsibilityPattern)課件_第4頁
第15章責任鏈模式(ChainofResponsibilityPattern)課件_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第15章責任鏈模式

(ChainofResponsibilityPattern)第15章責任鏈模式

(ChainofResponsib行為型模式行為型模式概述行為型模式(BehavioralPattern)是對在不同的對象之間劃分責任和算法的抽象化。行為型模式不僅僅關注類和對象的結構,而且重點關注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責,并研究系統(tǒng)在運行時實例對象之間的交互。在系統(tǒng)運行時,對象并不是孤立的,它們可以通過相互通信與協(xié)作完成某些復雜功能,一個對象在運行時也將影響到其他對象的運行。行為型模式行為型模式概述行為型模式分為類行為型模式和對象行為型模式兩種:類行為型模式:類的行為型模式使用繼承關系在幾個類之間分配行為,類行為型模式主要通過多態(tài)等方式來分配父類與子類的職責。對象行為型模式:對象的行為型模式則使用對象的聚合關聯(lián)關系來分配行為,對象行為型模式主要是通過對象關聯(lián)等方式來分配兩個或多個類的職責。根據(jù)“合成復用原則”,系統(tǒng)中要盡量使用關聯(lián)關系來取代繼承關系,因此大部分行為型設計模式都屬于對象行為型設計模式。行為型模式行為型模式分為類行為型模式和對象行為型模式兩種:行為型模式行為型模式行為型模式簡介職責鏈模式(ChainofResponsibility)命令模式(Command)解釋器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)備忘錄模式(Memento)觀察者模式(Observer)狀態(tài)模式(State)策略模式(Strategy)模板方法模式(TemplateMethod)訪問者模式(Visitor)行為型模式行為型模式簡介職責鏈模式職責鏈模式職責鏈模式模式動機職責鏈可以是一條直線、一個環(huán)或者一個樹形結構,最常見的職責鏈是直線型,即沿著一條單向的鏈來傳遞請求。鏈上的每一個對象都是請求處理者,職責鏈模式可以將請求的處理者組織成一條鏈,并使請求沿著鏈傳遞,由鏈上的處理者對請求進行相應的處理,客戶端無須關心請求的處理細節(jié)以及請求的傳遞,只需將請求發(fā)送到鏈上即可,將請求的發(fā)送者和請求的處理者解耦。這就是職責鏈模式的模式動機。職責鏈模式模式動機模式定義

避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。由于英文翻譯的不同,職責鏈模式又稱為責任鏈模式,它是一種對象行為型模式。職責鏈模式模式定義職責鏈模式責任鏈模式的UML類結構責任鏈模式的UML類結構抽象處理者(Handler)角色

定義出一個處理請求的接口;如果需要,接口可以定義出一個方法,以設定和返回對下家的引用。這個角色通常由一個抽象類或接口實現(xiàn)。

具體處理者(ConcreteHandler)角色具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。抽象處理者(Handler)角色 定義出一個處理請求的接口職責鏈模式模式分析在職責鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這條鏈上傳遞,直到鏈上的某一個對象處理此請求為止。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織鏈和分配責任。職責鏈模式模式分析publicabstract

class

Handler{

protected

Handler

successor;

public

void

SetSuccessor(

Handler

successor

)

{

this.successor

=

successor;

}

abstract

public

void

HandleRequest(

int

request

);

}publicclass

ConcreteHandler1

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

0

&&

request

<

10

)

System.out.println(“handled

request“+request.toString()

);

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicabstract

class

Handler{publicclass

ConcreteHandler2

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

10

&&

request

<

20

)

system.out.println("handled

request

“+request.toString());

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicclass

ConcreteHandler3

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

20

&&

request

<

30

)

System.out.println("handled

request:“+request.toString()

);

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicclass

ConcreteHandler2

public

class

Client

{

public

static

void

main(

String[]

args

)

{

//

Setup

Chain

of

Responsibility

Handler

h1

=

new

ConcreteHandler1();

Handler

h2

=

new

ConcreteHandler2();

Handler

h3

=

new

ConcreteHandler3();

h1.SetSuccessor(h2);

h2.SetSuccessor(h3);

//

Generate

and

process

request

int[]

requests

=

{

2,

5,

14,

22,

18,

3,

27,

20

};

foreach(

int

request

in

requests

)

h1.HandleRequest(

request

);

}

}public

class

Client

{

public擊鼓傳花

擊鼓者將花傳給賈母,開始傳花游戲。花由賈母傳給賈赦,由賈赦傳給賈政,由賈政傳給賈寶玉,又由賈寶玉傳給賈環(huán),由賈環(huán)傳回給賈母,如此往復。當鼓聲停止時,手中有花的人就得執(zhí)行酒令.擊鼓傳花 擊鼓者將花傳給賈母,開始傳花游戲?;ㄓ少Z母傳給賈赦擊鼓傳花系統(tǒng)的UML類圖擊鼓傳花系統(tǒng)的UML類圖抽象處理者abstractclassPlayer{

abstractpublicvoidhandle(inti);//處理方法

privatePlayersuccessor;

publicPlayer(){successor=null;}

protectedvoidsetSuccessor(PlayeraSuccessor){

successor=aSuccessor;

}

publicvoidnext(intindex){//傳遞方法

if(successor!=null){

successor.handle(index);

}

else{

System.out.println("Programterminated.");

}

}

}抽象處理者abstractclassPlayer具體處理者classJiaMuextendsPlayer{

publicJiaMu(PlayeraSuccessor){

this.setSuccessor(aSuccessor);

}

publicvoidhandle(inti){

if(i==1){

System.out.println("JiaMugottadrink!");

}

else{

System.out.println("JiaMupassed!");

next(i);

}

}

}具體處理者classJiaMuextendsPlaye客戶端publicclassDrumBeater{

privatestaticPlayerplayer;

staticpublicvoidmain(String[]args)

{

player=newJiaMu(newJiaShe(new

JiaZheng(newJiaBaoYu(new

JiaHuan(null)))));

player.handle(4);

}

}客戶端publicclassDrumBeater{

AWT事件浮升機制事件首先傳播到它所發(fā)生的部件上,然后向其父類處理器傳播。容器可以選擇處理這個事件,或者再將此事件向更高一級的父類處理器傳播。事件如此一級級地向上傳播,就像水底的氣泡一點一點地冒到水面上一樣,因此又叫做事件浮升機制。

AWT事件浮升機制事件首先傳播到它所發(fā)生的部件上,然后向其父AWT庫里處理事件的代碼publicbooleanaction(Eventevent,Objectobj){

if(event.target==btnOK){

doOKBtnAction();

}

elseif(event.target==btnExit){

doExitBtnAction();

}

else{

returnsuper.action(event,obj);

}

returntrue;

}

AWT1.1的事件處理模型于1.0相比有了很大的變化。新的事件處理模型是建立在觀察者模式的基礎之上的,而不再是責任鏈模式的基礎之上的。

AWT庫里處理事件的代碼publicbooleanacAWT庫里處理事件的缺點AWT1.0的事件處理的模型是基于繼承的,會導致很多的子類,在一個面向對象的系統(tǒng)里,經常使用的應當是委派。由于每一個事件都會沿著部件樹結構向上傳播,因此事件浮升機制會使得事件的處理變得較慢。AWT庫里處理事件的缺點AWT1.0的事件處理的模型是基于繼舉例把一個對象在一個鏈接傳遞直到被處理。在這個鏈上的所有的對象有相同的接口(抽象類)但卻有不同的實現(xiàn)。java.util.logging.Logger方法

log()

ApacheTomcat的對Encoding的處理Struts2的攔截器jspservlet的FilterJavaScript事件浮升機制舉例把一個對象在一個鏈接傳遞直到被處理。在這個鏈上的所有的對ExampleAllsmallchildrencausedamage,buthowshouldtheybepunished?Baseduponthedollaramountofdamagedonebythechild,thefamilymustdecidewhoistopunishtheirchild.WhointhisChainofResponsibilityistopunishthechild;TheGrandma,theMother,theFather,orsomethingworse...muwhaahahahaaa.ExampleAllsmallchildrencausUMLDiagramofChainofresponsibilityUMLDiagramofChainofresponCodeabstractclassKidsPunished{

publicintleast=15;

publicKidsPunishedsuccessor;

publicvoidsetSuccessor(KidsPunishedsuccessor){

this.successor=successor;}

abstractpublicvoidprocessRequest(PunishRequestrequest);}CodeabstractclassKidsPunisheMoreCodeclassGrandmaextendsKidsPunished{

publicinttolerance=10*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soGrandmajobstopunish");

else

if(successor!=null)cessRequest(request);}}MoreCodeclassGrandmaextendsCodeclassMotherextendsKidsPunished{

privatefinaldoubletolerance=20*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soMom'sjobstopunish");

else

if(successor!=null)cessRequest(request);}}CodeclassMotherextendsKidsPCodeclassFatherextendsKidsPunished{

publicinttolerance=30*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soFather'sjobstopunish");

else

if(successor!=null)cessRequest(request);}}CodeclassFatherextendsKidsPclassHigherPowerextendsKidsPunished{

publicinttolerance=100*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",prayforforgiveness");

else

if(successor!=null)cessRequest(request);}}classHigherPowerextendsKidsClassPunishRequest{publicdoubleamount;publicPunishRequest(doubleamount){this.amount=amount;}publicdoublegetAmount(){returnamount;}publicvoidsetAmount(doubleamt){amount=amt;}}ClassPunishRequest{FinallyitsPunishingTime!!classPunishingTime{publicstaticvoidmain(String[]args){Grandmagranny=newGrandma();Mothermomma=newMother();Fatherdad=newFather();HigherPowergod=newHigherPower();granny.setSuccessor(momma);momma.setSuccessor(dad);dad.setSuccessor(god);try{while(true){System.out.println("EntertheamountinDamagesyourchildcaused.");System.out.print(":");doubledollar=Double.parseDouble(new BufferedReader(newInputStreamReader(System.in)).readLine());cessRequest(newPunishRequest(dollar));}}catch(Exceptione){System.exit(1);}}FinallyitsPunishingTime!!clExampleWheneveryouspendcompany'smoney,youneedgetapprovalfromyourboss,oryourboss'sboss.Let'ssay,theleadershipchainis:Manager-->Director-->VicePresident-->PresidentabstractclassApprover{ protectedfinaldoublebase=500; protectedApproversuccessor; publicvoidsetSuccessor(Approversuccessor){ this.successor=successor;} abstractpublicvoidprocessRequest(PurchaseRequestrequest);}classManagerextendsApprover{ privatefinaldoubleALLOWABLE=10*base; publicvoidprocessRequest(PurchaseRequestrequest){ if(request.getAmount()<ALLOWABLE) System.out.println("Managerwillapprove$"+request.getAmount()); elseif(successor!=null)cessRequest(request); }}ExampleWheneveryouspendcomExample(Cont)Managermanager=newManager();Directordirector=newDirector();VicePresidentvp=newVicePresident();Presidentpresident=newPresident()manager.setSuccessor(director);director.setSuccessor(vp);vp.setSuccessor(president);try{while(true){System.out.println("Entertheamounttocheckwhoshouldapproveyourexpenditure.");System.out.print(">");doubled=Double.parseDouble(newBufferedReader(newInputStreamReader(System.in)).readLine());cessRequest(newPurchaseRequest(0,d,"General"));}}catch(Exceptione){System.exit(1);}Example(Cont)Managermanager純的與不純的責任鏈模式一個純的責任鏈模式要求一個具體的處理者對象只能在兩個行為中選擇一個:一個是承擔責任,二是把責任推給下家。不允許出現(xiàn)某一個具體處理者對象在承擔了一部分責任后又把責任向下傳的情況。在一個純的責任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。純的責任鏈模式的例子是不容易找到的,一

般看到的例子均是不純的責任鏈模式的實現(xiàn)。純的與不純的責任鏈模式一個純的責任鏈模式要求一個具體的處理職責鏈模式優(yōu)缺點職責鏈模式的優(yōu)點降低耦合度可簡化對象的相互連接增強給對象指派職責的靈活性增加新的請求處理類很方便職責鏈模式優(yōu)缺點職責鏈模式的優(yōu)點職責鏈模式的缺點不能保證請求一定被接收。系統(tǒng)性能將受到一定影響,而且在進行代碼調試時不太方便;可能會造成循環(huán)調用。職責鏈模式優(yōu)缺點職責鏈模式的缺點職責鏈模式優(yōu)缺點有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。可動態(tài)指定一組對象處理請求。應用場景有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時ADecoratorusuallywrapsthedecoratedobject:clientspointtothedecoratorandnottheobjectADecoratordoesnothavetoforwardthesamemessageAdecoratedobjectdoesnothavetoknowthatitiswrappedWithachainofresponsibility,theclientasksthefirstchainobjectsexplicitly.38DifferenceswithDecoratorADecoratorusuallywrapstheInchainofresponsibility:youcanbreakthechainatanypointDecoratorscanbethoughtofasexecutingallatoncewithoutanyinteractionwiththeotherdecoratorsLinksinachaincanbethoughtofasexecutingoneatatime,becausetheyeachdependonthepreviouslink39ChainofresposibilityvsDecoratorInchainofresponsibility:yo裝飾模式也以類似的方式形成一條裝飾鏈主要目的是減少對象之間的藕合:一個對象只需知道如何將請求轉發(fā)給其他對象。鏈中的每個對象都是“自治”的,它對其他對象一無所知,只需判斷它本身能否滿足請求這樣,既能獨立編寫每個對象,又很容易構建鏈.鏈中的最后一個對象是以默認方式處理它收到的所有請求,還是簡單地拋棄請求。2.責任鏈模式通常應用于圖形用戶界面中,窗口中可以包含控件,控件中還可以包含控件??丶盏较r,要么處理該消息要么將消息傳遞給父控件.

責任鏈還會以樹狀出現(xiàn),一個事件可以傳遞給多個類,多個類也可以將信息提交給一個類與裝飾模式的比較裝飾模式也以類似的方式形成一條裝飾鏈與裝飾模式的比較思考每個應用系統(tǒng)都有的登錄驗證。一般登陸驗證有幾個方面的驗證:1.用戶輸入?yún)?shù)的驗證,如輸入?yún)?shù)是否符合輸入要求,字段長度要求,是否都是合法字符等。2.當前客戶端用戶的安全檢查,用戶是否為禁用用戶,用戶IP是否未禁用IP,用戶是否被鎖定等。3.用戶權限檢查,檢查用戶是否在系統(tǒng)中存在,用戶密碼是否正確思考每個應用系統(tǒng)都有的登錄驗證。一般登陸驗證有幾個方面的驗證某OA系統(tǒng)需要提供一個假條審批的模塊,如果員工請假天數(shù)小于3天,主任可以審批該假條;如果員工請假天數(shù)大于等于3天,小于10天,經理可以審批;如果員工請假天數(shù)大于等于10天,小于30天,總經理可以審批;如果超過30天,總經理也不能審批,提示相應的拒絕信息。用責任鏈模式模擬。第15次作業(yè)某OA系統(tǒng)需要提供一個假條審批的模塊,如果員工請假天數(shù)小于3用責任鏈模式模擬javascript事件冒泡第15次作業(yè)(上機題)用責任鏈模式模擬javascript事件冒泡第15次作業(yè)(上第15章責任鏈模式

(ChainofResponsibilityPattern)第15章責任鏈模式

(ChainofResponsib行為型模式行為型模式概述行為型模式(BehavioralPattern)是對在不同的對象之間劃分責任和算法的抽象化。行為型模式不僅僅關注類和對象的結構,而且重點關注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責,并研究系統(tǒng)在運行時實例對象之間的交互。在系統(tǒng)運行時,對象并不是孤立的,它們可以通過相互通信與協(xié)作完成某些復雜功能,一個對象在運行時也將影響到其他對象的運行。行為型模式行為型模式概述行為型模式分為類行為型模式和對象行為型模式兩種:類行為型模式:類的行為型模式使用繼承關系在幾個類之間分配行為,類行為型模式主要通過多態(tài)等方式來分配父類與子類的職責。對象行為型模式:對象的行為型模式則使用對象的聚合關聯(lián)關系來分配行為,對象行為型模式主要是通過對象關聯(lián)等方式來分配兩個或多個類的職責。根據(jù)“合成復用原則”,系統(tǒng)中要盡量使用關聯(lián)關系來取代繼承關系,因此大部分行為型設計模式都屬于對象行為型設計模式。行為型模式行為型模式分為類行為型模式和對象行為型模式兩種:行為型模式行為型模式行為型模式簡介職責鏈模式(ChainofResponsibility)命令模式(Command)解釋器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)備忘錄模式(Memento)觀察者模式(Observer)狀態(tài)模式(State)策略模式(Strategy)模板方法模式(TemplateMethod)訪問者模式(Visitor)行為型模式行為型模式簡介職責鏈模式職責鏈模式職責鏈模式模式動機職責鏈可以是一條直線、一個環(huán)或者一個樹形結構,最常見的職責鏈是直線型,即沿著一條單向的鏈來傳遞請求。鏈上的每一個對象都是請求處理者,職責鏈模式可以將請求的處理者組織成一條鏈,并使請求沿著鏈傳遞,由鏈上的處理者對請求進行相應的處理,客戶端無須關心請求的處理細節(jié)以及請求的傳遞,只需將請求發(fā)送到鏈上即可,將請求的發(fā)送者和請求的處理者解耦。這就是職責鏈模式的模式動機。職責鏈模式模式動機模式定義

避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。由于英文翻譯的不同,職責鏈模式又稱為責任鏈模式,它是一種對象行為型模式。職責鏈模式模式定義職責鏈模式責任鏈模式的UML類結構責任鏈模式的UML類結構抽象處理者(Handler)角色

定義出一個處理請求的接口;如果需要,接口可以定義出一個方法,以設定和返回對下家的引用。這個角色通常由一個抽象類或接口實現(xiàn)。

具體處理者(ConcreteHandler)角色具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。抽象處理者(Handler)角色 定義出一個處理請求的接口職責鏈模式模式分析在職責鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這條鏈上傳遞,直到鏈上的某一個對象處理此請求為止。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織鏈和分配責任。職責鏈模式模式分析publicabstract

class

Handler{

protected

Handler

successor;

public

void

SetSuccessor(

Handler

successor

)

{

this.successor

=

successor;

}

abstract

public

void

HandleRequest(

int

request

);

}publicclass

ConcreteHandler1

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

0

&&

request

<

10

)

System.out.println(“handled

request“+request.toString()

);

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicabstract

class

Handler{publicclass

ConcreteHandler2

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

10

&&

request

<

20

)

system.out.println("handled

request

“+request.toString());

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicclass

ConcreteHandler3

extends

Handler{

public

void

HandleRequest(

int

request

)

{

if(

request

>=

20

&&

request

<

30

)

System.out.println("handled

request:“+request.toString()

);

else

if(

successor

!=

null

)

successor.HandleRequest(

request

);

}

}publicclass

ConcreteHandler2

public

class

Client

{

public

static

void

main(

String[]

args

)

{

//

Setup

Chain

of

Responsibility

Handler

h1

=

new

ConcreteHandler1();

Handler

h2

=

new

ConcreteHandler2();

Handler

h3

=

new

ConcreteHandler3();

h1.SetSuccessor(h2);

h2.SetSuccessor(h3);

//

Generate

and

process

request

int[]

requests

=

{

2,

5,

14,

22,

18,

3,

27,

20

};

foreach(

int

request

in

requests

)

h1.HandleRequest(

request

);

}

}public

class

Client

{

public擊鼓傳花

擊鼓者將花傳給賈母,開始傳花游戲?;ㄓ少Z母傳給賈赦,由賈赦傳給賈政,由賈政傳給賈寶玉,又由賈寶玉傳給賈環(huán),由賈環(huán)傳回給賈母,如此往復。當鼓聲停止時,手中有花的人就得執(zhí)行酒令.擊鼓傳花 擊鼓者將花傳給賈母,開始傳花游戲。花由賈母傳給賈赦擊鼓傳花系統(tǒng)的UML類圖擊鼓傳花系統(tǒng)的UML類圖抽象處理者abstractclassPlayer{

abstractpublicvoidhandle(inti);//處理方法

privatePlayersuccessor;

publicPlayer(){successor=null;}

protectedvoidsetSuccessor(PlayeraSuccessor){

successor=aSuccessor;

}

publicvoidnext(intindex){//傳遞方法

if(successor!=null){

successor.handle(index);

}

else{

System.out.println("Programterminated.");

}

}

}抽象處理者abstractclassPlayer具體處理者classJiaMuextendsPlayer{

publicJiaMu(PlayeraSuccessor){

this.setSuccessor(aSuccessor);

}

publicvoidhandle(inti){

if(i==1){

System.out.println("JiaMugottadrink!");

}

else{

System.out.println("JiaMupassed!");

next(i);

}

}

}具體處理者classJiaMuextendsPlaye客戶端publicclassDrumBeater{

privatestaticPlayerplayer;

staticpublicvoidmain(String[]args)

{

player=newJiaMu(newJiaShe(new

JiaZheng(newJiaBaoYu(new

JiaHuan(null)))));

player.handle(4);

}

}客戶端publicclassDrumBeater{

AWT事件浮升機制事件首先傳播到它所發(fā)生的部件上,然后向其父類處理器傳播。容器可以選擇處理這個事件,或者再將此事件向更高一級的父類處理器傳播。事件如此一級級地向上傳播,就像水底的氣泡一點一點地冒到水面上一樣,因此又叫做事件浮升機制。

AWT事件浮升機制事件首先傳播到它所發(fā)生的部件上,然后向其父AWT庫里處理事件的代碼publicbooleanaction(Eventevent,Objectobj){

if(event.target==btnOK){

doOKBtnAction();

}

elseif(event.target==btnExit){

doExitBtnAction();

}

else{

returnsuper.action(event,obj);

}

returntrue;

}

AWT1.1的事件處理模型于1.0相比有了很大的變化。新的事件處理模型是建立在觀察者模式的基礎之上的,而不再是責任鏈模式的基礎之上的。

AWT庫里處理事件的代碼publicbooleanacAWT庫里處理事件的缺點AWT1.0的事件處理的模型是基于繼承的,會導致很多的子類,在一個面向對象的系統(tǒng)里,經常使用的應當是委派。由于每一個事件都會沿著部件樹結構向上傳播,因此事件浮升機制會使得事件的處理變得較慢。AWT庫里處理事件的缺點AWT1.0的事件處理的模型是基于繼舉例把一個對象在一個鏈接傳遞直到被處理。在這個鏈上的所有的對象有相同的接口(抽象類)但卻有不同的實現(xiàn)。java.util.logging.Logger方法

log()

ApacheTomcat的對Encoding的處理Struts2的攔截器jspservlet的FilterJavaScript事件浮升機制舉例把一個對象在一個鏈接傳遞直到被處理。在這個鏈上的所有的對ExampleAllsmallchildrencausedamage,buthowshouldtheybepunished?Baseduponthedollaramountofdamagedonebythechild,thefamilymustdecidewhoistopunishtheirchild.WhointhisChainofResponsibilityistopunishthechild;TheGrandma,theMother,theFather,orsomethingworse...muwhaahahahaaa.ExampleAllsmallchildrencausUMLDiagramofChainofresponsibilityUMLDiagramofChainofresponCodeabstractclassKidsPunished{

publicintleast=15;

publicKidsPunishedsuccessor;

publicvoidsetSuccessor(KidsPunishedsuccessor){

this.successor=successor;}

abstractpublicvoidprocessRequest(PunishRequestrequest);}CodeabstractclassKidsPunisheMoreCodeclassGrandmaextendsKidsPunished{

publicinttolerance=10*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soGrandmajobstopunish");

else

if(successor!=null)cessRequest(request);}}MoreCodeclassGrandmaextendsCodeclassMotherextendsKidsPunished{

privatefinaldoubletolerance=20*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soMom'sjobstopunish");

else

if(successor!=null)cessRequest(request);}}CodeclassMotherextendsKidsPCodeclassFatherextendsKidsPunished{

publicinttolerance=30*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",soFather'sjobstopunish");

else

if(successor!=null)cessRequest(request);}}CodeclassFatherextendsKidsPclassHigherPowerextendsKidsPunished{

publicinttolerance=100*least;

publicvoidprocessRequest(PunishRequestrequest){

if(request.getAmount()<tolerance)System.out.println("Amountis$"+request.getAmount()+",prayforforgiveness");

else

if(successor!=null)cessRequest(request);}}classHigherPowerextendsKidsClassPunishRequest{publicdoubleamount;publicPunishRequest(doubleamount){this.amount=amount;}publicdoublegetAmount(){returnamount;}publicvoidsetAmount(doubleamt){amount=amt;}}ClassPunishRequest{FinallyitsPunishingTime!!classPunishingTime{publicstaticvoidmain(String[]args){Grandmagranny=newGrandma();Mothermomma=newMother();Fatherdad=newFather();HigherPowergod=newHigherPower();granny.setSuccessor(momma);momma.setSuccessor(dad);dad.setSuccessor(god);try{while(true){System.out.println("EntertheamountinDamagesyourchildcaused.");System.out.print(":");doubledollar=Double.parseDouble(new BufferedReader(newInputStreamReader(System.in)).readLine());cessRequest(newPunishRequest(dollar));}}catch(Exceptione){System.exit(1);}}FinallyitsPunishingTime!!clExampleWheneveryouspendcompany'smoney,youneedgetapprovalfromyourboss,oryourboss'sboss.Let'ssay,theleadershipchainis:Manager-->Director-->VicePresident-->PresidentabstractclassApprover{ protectedfinaldoublebase=500; protectedApproversuccessor; publicvoidsetSuccessor(Approversuccessor){ this.successor=successor;} abstractpublicvoidprocessRequest(PurchaseRequestrequest);}classManagerextendsApprover{ privatefinaldoubleALLOWABLE=10*base; publicvoidprocessRequest(PurchaseRequestrequest){ if(request.getAmount()<ALLOWABLE) System.out.println("Managerwillapprove$"+request.getAmount()); elseif(successor!=null)cessRequest(request); }}ExampleWheneveryouspendcomExample(Cont)Managermanager=newManager();Directordirector=newDirector();VicePresidentvp=newVicePresident();Presidentpresid

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論