




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第15章責(zé)任鏈模式
(ChainofResponsibilityPattern)第15章責(zé)任鏈模式
(ChainofResponsib行為型模式行為型模式概述行為型模式(BehavioralPattern)是對在不同的對象之間劃分責(zé)任和算法的抽象化。行為型模式不僅僅關(guān)注類和對象的結(jié)構(gòu),而且重點(diǎn)關(guān)注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責(zé),并研究系統(tǒng)在運(yùn)行時(shí)實(shí)例對象之間的交互。在系統(tǒng)運(yùn)行時(shí),對象并不是孤立的,它們可以通過相互通信與協(xié)作完成某些復(fù)雜功能,一個(gè)對象在運(yùn)行時(shí)也將影響到其他對象的運(yùn)行。行為型模式行為型模式概述行為型模式分為類行為型模式和對象行為型模式兩種:類行為型模式:類的行為型模式使用繼承關(guān)系在幾個(gè)類之間分配行為,類行為型模式主要通過多態(tài)等方式來分配父類與子類的職責(zé)。對象行為型模式:對象的行為型模式則使用對象的聚合關(guān)聯(lián)關(guān)系來分配行為,對象行為型模式主要是通過對象關(guān)聯(lián)等方式來分配兩個(gè)或多個(gè)類的職責(zé)。根據(jù)“合成復(fù)用原則”,系統(tǒng)中要盡量使用關(guān)聯(lián)關(guān)系來取代繼承關(guān)系,因此大部分行為型設(shè)計(jì)模式都屬于對象行為型設(shè)計(jì)模式。行為型模式行為型模式分為類行為型模式和對象行為型模式兩種:行為型模式行為型模式行為型模式簡介職責(zé)鏈模式(ChainofResponsibility)命令模式(Command)解釋器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)備忘錄模式(Memento)觀察者模式(Observer)狀態(tài)模式(State)策略模式(Strategy)模板方法模式(TemplateMethod)訪問者模式(Visitor)行為型模式行為型模式簡介職責(zé)鏈模式職責(zé)鏈模式職責(zé)鏈模式模式動(dòng)機(jī)職責(zé)鏈可以是一條直線、一個(gè)環(huán)或者一個(gè)樹形結(jié)構(gòu),最常見的職責(zé)鏈?zhǔn)侵本€型,即沿著一條單向的鏈來傳遞請求。鏈上的每一個(gè)對象都是請求處理者,職責(zé)鏈模式可以將請求的處理者組織成一條鏈,并使請求沿著鏈傳遞,由鏈上的處理者對請求進(jìn)行相應(yīng)的處理,客戶端無須關(guān)心請求的處理細(xì)節(jié)以及請求的傳遞,只需將請求發(fā)送到鏈上即可,將請求的發(fā)送者和請求的處理者解耦。這就是職責(zé)鏈模式的模式動(dòng)機(jī)。職責(zé)鏈模式模式動(dòng)機(jī)模式定義
避免請求發(fā)送者與接收者耦合在一起,讓多個(gè)對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。由于英文翻譯的不同,職責(zé)鏈模式又稱為責(zé)任鏈模式,它是一種對象行為型模式。職責(zé)鏈模式模式定義職責(zé)鏈模式責(zé)任鏈模式的UML類結(jié)構(gòu)責(zé)任鏈模式的UML類結(jié)構(gòu)抽象處理者(Handler)角色
定義出一個(gè)處理請求的接口;如果需要,接口可以定義出一個(gè)方法,以設(shè)定和返回對下家的引用。這個(gè)角色通常由一個(gè)抽象類或接口實(shí)現(xiàn)。
具體處理者(ConcreteHandler)角色具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。抽象處理者(Handler)角色 定義出一個(gè)處理請求的接口職責(zé)鏈模式模式分析在職責(zé)鏈模式里,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈。請求在這條鏈上傳遞,直到鏈上的某一個(gè)對象處理此請求為止。發(fā)出這個(gè)請求的客戶端并不知道鏈上的哪一個(gè)對象最終處理這個(gè)請求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織鏈和分配責(zé)任。職責(zé)鏈模式模式分析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)傳回給賈母,如此往復(fù)。當(dāng)鼓聲停止時(shí),手中有花的人就得執(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事件浮升機(jī)制事件首先傳播到它所發(fā)生的部件上,然后向其父類處理器傳播。容器可以選擇處理這個(gè)事件,或者再將此事件向更高一級的父類處理器傳播。事件如此一級級地向上傳播,就像水底的氣泡一點(diǎn)一點(diǎn)地冒到水面上一樣,因此又叫做事件浮升機(jī)制。
AWT事件浮升機(jī)制事件首先傳播到它所發(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相比有了很大的變化。新的事件處理模型是建立在觀察者模式的基礎(chǔ)之上的,而不再是責(zé)任鏈模式的基礎(chǔ)之上的。
AWT庫里處理事件的代碼publicbooleanacAWT庫里處理事件的缺點(diǎn)AWT1.0的事件處理的模型是基于繼承的,會導(dǎo)致很多的子類,在一個(gè)面向?qū)ο蟮南到y(tǒng)里,經(jīng)常使用的應(yīng)當(dāng)是委派。由于每一個(gè)事件都會沿著部件樹結(jié)構(gòu)向上傳播,因此事件浮升機(jī)制會使得事件的處理變得較慢。AWT庫里處理事件的缺點(diǎn)AWT1.0的事件處理的模型是基于繼舉例把一個(gè)對象在一個(gè)鏈接傳遞直到被處理。在這個(gè)鏈上的所有的對象有相同的接口(抽象類)但卻有不同的實(shí)現(xiàn)。java.util.logging.Logger方法
log()
ApacheTomcat的對Encoding的處理Struts2的攔截器jspservlet的FilterJavaScript事件浮升機(jī)制舉例把一個(gè)對象在一個(gè)鏈接傳遞直到被處理。在這個(gè)鏈上的所有的對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純的與不純的責(zé)任鏈模式一個(gè)純的責(zé)任鏈模式要求一個(gè)具體的處理者對象只能在兩個(gè)行為中選擇一個(gè):一個(gè)是承擔(dān)責(zé)任,二是把責(zé)任推給下家。不允許出現(xiàn)某一個(gè)具體處理者對象在承擔(dān)了一部分責(zé)任后又把責(zé)任向下傳的情況。在一個(gè)純的責(zé)任鏈模式里面,一個(gè)請求必須被某一個(gè)處理者對象所接收;在一個(gè)不純的責(zé)任鏈模式里面,一個(gè)請求可以最終不被任何接收端對象所接收。純的責(zé)任鏈模式的例子是不容易找到的,一
般看到的例子均是不純的責(zé)任鏈模式的實(shí)現(xiàn)。純的與不純的責(zé)任鏈模式一個(gè)純的責(zé)任鏈模式要求一個(gè)具體的處理職責(zé)鏈模式優(yōu)缺點(diǎn)職責(zé)鏈模式的優(yōu)點(diǎn)降低耦合度可簡化對象的相互連接增強(qiáng)給對象指派職責(zé)的靈活性增加新的請求處理類很方便職責(zé)鏈模式優(yōu)缺點(diǎn)職責(zé)鏈模式的優(yōu)點(diǎn)職責(zé)鏈模式的缺點(diǎn)不能保證請求一定被接收。系統(tǒng)性能將受到一定影響,而且在進(jìn)行代碼調(diào)試時(shí)不太方便;可能會造成循環(huán)調(diào)用。職責(zé)鏈模式優(yōu)缺點(diǎn)職責(zé)鏈模式的缺點(diǎn)職責(zé)鏈模式優(yōu)缺點(diǎn)有多個(gè)對象可以處理同一個(gè)請求,具體哪個(gè)對象處理該請求由運(yùn)行時(shí)刻自動(dòng)確定。在不明確指定接收者的情況下,向多個(gè)對象中的一個(gè)提交一個(gè)請求??蓜?dòng)態(tài)指定一組對象處理請求。應(yīng)用場景有多個(gè)對象可以處理同一個(gè)請求,具體哪個(gè)對象處理該請求由運(yùn)行時(shí)ADecoratorusuallywrapsthedecoratedobject:clientspointtothedecoratorandnottheobjectADecoratordoesnothavetoforwardthesamemessageAdecoratedobjectdoesnothavetoknowthatitiswrappedWithachainofresponsibility,theclientasksthefirstchainobjectsexplicitly.38DifferenceswithDecoratorADecoratorusuallywrapstheInchainofresponsibility:youcanbreakthechainatanypointDecoratorscanbethoughtofasexecutingallatoncewithoutanyinteractionwiththeotherdecoratorsLinksinachaincanbethoughtofasexecutingoneatatime,becausetheyeachdependonthepreviouslink39ChainofresposibilityvsDecoratorInchainofresponsibility:yo裝飾模式也以類似的方式形成一條裝飾鏈主要目的是減少對象之間的藕合:一個(gè)對象只需知道如何將請求轉(zhuǎn)發(fā)給其他對象。鏈中的每個(gè)對象都是“自治”的,它對其他對象一無所知,只需判斷它本身能否滿足請求這樣,既能獨(dú)立編寫每個(gè)對象,又很容易構(gòu)建鏈.鏈中的最后一個(gè)對象是以默認(rèn)方式處理它收到的所有請求,還是簡單地拋棄請求。2.責(zé)任鏈模式通常應(yīng)用于圖形用戶界面中,窗口中可以包含控件,控件中還可以包含控件??丶盏较r(shí),要么處理該消息要么將消息傳遞給父控件.
責(zé)任鏈還會以樹狀出現(xiàn),一個(gè)事件可以傳遞給多個(gè)類,多個(gè)類也可以將信息提交給一個(gè)類與裝飾模式的比較裝飾模式也以類似的方式形成一條裝飾鏈與裝飾模式的比較思考每個(gè)應(yīng)用系統(tǒng)都有的登錄驗(yàn)證。一般登陸驗(yàn)證有幾個(gè)方面的驗(yàn)證:1.用戶輸入?yún)?shù)的驗(yàn)證,如輸入?yún)?shù)是否符合輸入要求,字段長度要求,是否都是合法字符等。2.當(dāng)前客戶端用戶的安全檢查,用戶是否為禁用用戶,用戶IP是否未禁用IP,用戶是否被鎖定等。3.用戶權(quán)限檢查,檢查用戶是否在系統(tǒng)中存在,用戶密碼是否正確思考每個(gè)應(yīng)用系統(tǒng)都有的登錄驗(yàn)證。一般登陸驗(yàn)證有幾個(gè)方面的驗(yàn)證某OA系統(tǒng)需要提供一個(gè)假條審批的模塊,如果員工請假天數(shù)小于3天,主任可以審批該假條;如果員工請假天數(shù)大于等于3天,小于10天,經(jīng)理可以審批;如果員工請假天數(shù)大于等于10天,小于30天,總經(jīng)理可以審批;如果超過30天,總經(jīng)理也不能審批,提示相應(yīng)的拒絕信息。用責(zé)任鏈模式模擬。第15次作業(yè)某OA系統(tǒng)需要提供一個(gè)假條審批的模塊,如果員工請假天數(shù)小于3用責(zé)任鏈模式模擬javascript事件冒泡第15次作業(yè)(上機(jī)題)用責(zé)任鏈模式模擬javascript事件冒泡第15次作業(yè)(上第15章責(zé)任鏈模式
(ChainofResponsibilityPattern)第15章責(zé)任鏈模式
(ChainofResponsib行為型模式行為型模式概述行為型模式(BehavioralPattern)是對在不同的對象之間劃分責(zé)任和算法的抽象化。行為型模式不僅僅關(guān)注類和對象的結(jié)構(gòu),而且重點(diǎn)關(guān)注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責(zé),并研究系統(tǒng)在運(yùn)行時(shí)實(shí)例對象之間的交互。在系統(tǒng)運(yùn)行時(shí),對象并不是孤立的,它們可以通過相互通信與協(xié)作完成某些復(fù)雜功能,一個(gè)對象在運(yùn)行時(shí)也將影響到其他對象的運(yùn)行。行為型模式行為型模式概述行為型模式分為類行為型模式和對象行為型模式兩種:類行為型模式:類的行為型模式使用繼承關(guān)系在幾個(gè)類之間分配行為,類行為型模式主要通過多態(tài)等方式來分配父類與子類的職責(zé)。對象行為型模式:對象的行為型模式則使用對象的聚合關(guān)聯(lián)關(guān)系來分配行為,對象行為型模式主要是通過對象關(guān)聯(lián)等方式來分配兩個(gè)或多個(gè)類的職責(zé)。根據(jù)“合成復(fù)用原則”,系統(tǒng)中要盡量使用關(guān)聯(lián)關(guān)系來取代繼承關(guān)系,因此大部分行為型設(shè)計(jì)模式都屬于對象行為型設(shè)計(jì)模式。行為型模式行為型模式分為類行為型模式和對象行為型模式兩種:行為型模式行為型模式行為型模式簡介職責(zé)鏈模式(ChainofResponsibility)命令模式(Command)解釋器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)備忘錄模式(Memento)觀察者模式(Observer)狀態(tài)模式(State)策略模式(Strategy)模板方法模式(TemplateMethod)訪問者模式(Visitor)行為型模式行為型模式簡介職責(zé)鏈模式職責(zé)鏈模式職責(zé)鏈模式模式動(dòng)機(jī)職責(zé)鏈可以是一條直線、一個(gè)環(huán)或者一個(gè)樹形結(jié)構(gòu),最常見的職責(zé)鏈?zhǔn)侵本€型,即沿著一條單向的鏈來傳遞請求。鏈上的每一個(gè)對象都是請求處理者,職責(zé)鏈模式可以將請求的處理者組織成一條鏈,并使請求沿著鏈傳遞,由鏈上的處理者對請求進(jìn)行相應(yīng)的處理,客戶端無須關(guān)心請求的處理細(xì)節(jié)以及請求的傳遞,只需將請求發(fā)送到鏈上即可,將請求的發(fā)送者和請求的處理者解耦。這就是職責(zé)鏈模式的模式動(dòng)機(jī)。職責(zé)鏈模式模式動(dòng)機(jī)模式定義
避免請求發(fā)送者與接收者耦合在一起,讓多個(gè)對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。由于英文翻譯的不同,職責(zé)鏈模式又稱為責(zé)任鏈模式,它是一種對象行為型模式。職責(zé)鏈模式模式定義職責(zé)鏈模式責(zé)任鏈模式的UML類結(jié)構(gòu)責(zé)任鏈模式的UML類結(jié)構(gòu)抽象處理者(Handler)角色
定義出一個(gè)處理請求的接口;如果需要,接口可以定義出一個(gè)方法,以設(shè)定和返回對下家的引用。這個(gè)角色通常由一個(gè)抽象類或接口實(shí)現(xiàn)。
具體處理者(ConcreteHandler)角色具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。抽象處理者(Handler)角色 定義出一個(gè)處理請求的接口職責(zé)鏈模式模式分析在職責(zé)鏈模式里,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈。請求在這條鏈上傳遞,直到鏈上的某一個(gè)對象處理此請求為止。發(fā)出這個(gè)請求的客戶端并不知道鏈上的哪一個(gè)對象最終處理這個(gè)請求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織鏈和分配責(zé)任。職責(zé)鏈模式模式分析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)傳回給賈母,如此往復(fù)。當(dāng)鼓聲停止時(shí),手中有花的人就得執(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事件浮升機(jī)制事件首先傳播到它所發(fā)生的部件上,然后向其父類處理器傳播。容器可以選擇處理這個(gè)事件,或者再將此事件向更高一級的父類處理器傳播。事件如此一級級地向上傳播,就像水底的氣泡一點(diǎn)一點(diǎn)地冒到水面上一樣,因此又叫做事件浮升機(jī)制。
AWT事件浮升機(jī)制事件首先傳播到它所發(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相比有了很大的變化。新的事件處理模型是建立在觀察者模式的基礎(chǔ)之上的,而不再是責(zé)任鏈模式的基礎(chǔ)之上的。
AWT庫里處理事件的代碼publicbooleanacAWT庫里處理事件的缺點(diǎn)AWT1.0的事件處理的模型是基于繼承的,會導(dǎo)致很多的子類,在一個(gè)面向?qū)ο蟮南到y(tǒng)里,經(jīng)常使用的應(yīng)當(dāng)是委派。由于每一個(gè)事件都會沿著部件樹結(jié)構(gòu)向上傳播,因此事件浮升機(jī)制會使得事件的處理變得較慢。AWT庫里處理事件的缺點(diǎn)AWT1.0的事件處理的模型是基于繼舉例把一個(gè)對象在一個(gè)鏈接傳遞直到被處理。在這個(gè)鏈上的所有的對象有相同的接口(抽象類)但卻有不同的實(shí)現(xiàn)。java.util.logging.Logger方法
log()
ApacheTomcat的對Encoding的處理Struts2的攔截器jspservlet的FilterJavaScript事件浮升機(jī)制舉例把一個(gè)對象在一個(gè)鏈接傳遞直到被處理。在這個(gè)鏈上的所有的對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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021-2026年中國機(jī)油冷卻器行業(yè)市場調(diào)研及投資戰(zhàn)略規(guī)劃報(bào)告
- 2025年中國車床行業(yè)市場前景預(yù)測及投資戰(zhàn)略研究報(bào)告
- 2025年菌種項(xiàng)目可行性分析報(bào)告
- 2025年中國海綿行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 2025至2030零售產(chǎn)業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國煙感型彩色攝像機(jī)行業(yè)市場深度調(diào)研及競爭格局與產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國火災(zāi)探測和滅火系統(tǒng)行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國滲透性瀉藥行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國液壓熱塑性塑料軟管和接頭行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國洗車清潔劑和肥皂行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 飼料學(xué)全套課件
- 奇瑞入職在線測評題庫
- 智能制造中的安全與隱私問題
- DB3307-T 119 -2021 金華地方傳統(tǒng)小吃 永康肉麥餅
- 過程校驗(yàn)儀市場需求分析報(bào)告
- 2017風(fēng)電功率預(yù)測系統(tǒng)測風(fēng)塔數(shù)據(jù)測量技術(shù)要求
- 樣品管理程序檢驗(yàn)科程序文件
- 橋梁基本狀況卡片(2021新版)
- 有機(jī)硅化學(xué)課件-有機(jī)硅化學(xué)基本反應(yīng)
- 《Python程序設(shè)計(jì)(第3版)》完整版PDF
- 如何根據(jù)三視圖畫軸測圖及補(bǔ)視圖缺線課件
評論
0/150
提交評論