軟件體系結(jié)構(gòu)與設(shè)計(jì)模式第9章責(zé)任鏈模式ppt課件
《軟件體系結(jié)構(gòu)與設(shè)計(jì)模式第9章責(zé)任鏈模式ppt課件》由會(huì)員分享,可在線閱讀,更多相關(guān)《軟件體系結(jié)構(gòu)與設(shè)計(jì)模式第9章責(zé)任鏈模式ppt課件(19頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第九章 責(zé)任鏈模式,,1,責(zé)任鏈模式 使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。 Chain of Responsibility Pattern Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.,1,2,Chain of Responsibility模式在軍隊(duì)中也有應(yīng)用的例子。某個(gè)下級(jí)軍官要求得到上級(jí)軍官的許可,這個(gè)請(qǐng)求將由其直接上級(jí)軍官再報(bào)給上級(jí)軍官的上級(jí)軍官,直到某個(gè)上級(jí)軍官有權(quán)利做決定為止。如果一名水兵請(qǐng)求進(jìn)入某個(gè)海軍基地,他說(shuō)執(zhí)行的請(qǐng)求過(guò)程就是Chain of Responsibility的實(shí)例。,3,一 、 概述,,4,責(zé)任鏈模式是使用多個(gè)對(duì)象處理用戶請(qǐng)求的成熟模式,責(zé)任鏈模式的關(guān)鍵是將用戶的請(qǐng)求分派給許多對(duì)象,這些對(duì)象被組織成一個(gè)責(zé)任鏈,即每個(gè)對(duì)象含有后繼對(duì)象的引用,并要求責(zé)任鏈上的每個(gè)對(duì)象,如果能處理用戶的請(qǐng)求,就做出處理,不再將用戶的請(qǐng)求傳遞給責(zé)任鏈上的下一個(gè)對(duì)象;如果不能處理用戶的請(qǐng)求,就必須將用戶的請(qǐng)求傳遞給責(zé)任鏈上的下一個(gè)對(duì)象。,4,二、責(zé)任鏈模式的結(jié)構(gòu)與使用,,5,模式的結(jié)構(gòu)中包括兩種角色: 處理者(Handler) 具體處理者(ConcreteHandler),5,,6,模式的UML類圖,6,aClient aHandler,aConcreteHandler successor,aConcreteHandler successor,,,,,,,,7,模式的結(jié)構(gòu)的描述與使用,用戶提交一個(gè)人的身份證號(hào)碼,想知道該人是否在北京、上?;蛱旖蚓幼 ?8,9,1.處理者(Handler): Handler.java public interface Handler{ public abstract void handleRequest(String number); public abstract void setNextHandler(Handler handler); },9,10,2.具體處理者(ConcreteHandler)_1: Beijing.java public class Beijing implements Handler{ private Handler handler; private ArrayList numberList; Beijing(){ numberList=new ArrayList(); numberList.add(“11129812340930034“); numberList.add(“10120810340930632“); numberList.add(“22029812340930034“); numberList.add(“32620810340930632“); } public void handleRequest(String number){ if(numberList.contains(number)) System.out.println(“該人在北京居住“); else{ System.out.println(“該人不在北京居住“); if(handler!=null) handler.handleRequest(number); } } public void setNextHandler(Handler handler){ this.handler=handler; }},10,11,2.具體處理者(ConcreteHandler)_2: Shanghai.java public class Shanghai implements Handler{ private Handler handler; private ArrayList numberList; Shanghai(){ numberList=new ArrayList(); numberList.add(“34529812340930034“); numberList.add(“98720810340430632“); numberList.add(“36529812340930034“); numberList.add(“77720810340930632“); } public void handleRequest(String number){ if(numberList.contains(number)) System.out.println(“該人在上海居住“); else{ System.out.println(“該人不在上海居住“); if(handler!=null) handler.handleRequest(number); } } public void setNextHandler(Handler handler){ this.handler=handler; } },11,12,2.具體處理者(ConcreteHandler)_3: Tianjin.java public class Tianjin implements Handler{ private Handler handler; private ArrayList numberList; Tianjin(){ numberList=new ArrayList(); numberList.add(“10029812340930034“); numberList.add(“20020810340430632“); numberList.add(“30029812340930034“); numberList.add(“50020810340930632“); } public void handleRequest(String number){ if(numberList.contains(number)) System.out.println(“該人在天津居住“); else{ System.out.println(“該人不在天津居住“); if(handler!=null) handler.handleRequest(number); } } public void setNextHandler(Handler handler){ this.handler=handler; } },12,13,3.應(yīng)用 Application.java public class Application{ private Handler beijing,shanghai,tianjin; public void createChain(){ beijing=new Beijing(); shanghai=new Shanghai(); tianjin=new Tianjin(); beijing.setNextHandler(shanghai); shanghai.setNextHandler(tianjin); } public void reponseClient(String number){ beijing.handleRequest(number); } public static void main(String args[]){ Application application=new Application(); application.createChain(); application.reponseClient(“77720810340930632“);; } },13,三、責(zé)任鏈模式的優(yōu)點(diǎn),,14,責(zé)任鏈中的對(duì)象只和自己的后繼是低耦合關(guān)系,和其他對(duì)象毫無(wú)關(guān)聯(lián),這使得編寫處理者對(duì)象以及創(chuàng)建責(zé)任鏈變得非常容易。 當(dāng)在處理者中分配職責(zé)時(shí),責(zé)任鏈給應(yīng)用程序更多的靈活性。 應(yīng)用程序可以動(dòng)態(tài)地增加、刪除處理者或重新指派處理者的職責(zé)。 應(yīng)用程序可以動(dòng)態(tài)地改變處理者之間的先后順序。 使用責(zé)任鏈的用戶不必知道處理者的信息,用戶不會(huì)知道到底是哪個(gè)對(duì)象處理了它的請(qǐng)求。,14,四、應(yīng)用舉例,// Handler.java public interface Handler{ public abstract void compuerMultiply(String number); public abstract void setNextHandler(Handler handler); },15,public class UseInt implements Handler{ private Handler handler; private int result=1 ; public void compuerMultiply(String number){ try{ int n=Integer.parseInt(number); int i=1; while(i=n){ result=result*i; if(result=0){ System.out.println(“超出我的能力范圍,我計(jì)算不了“); puerMultiply(number); return; } i++; } System.out.println(number+“的階乘:“+result); } catch(NumberFormatException exp){ System.out.println(exp.toString()); } } public void setNextHandler(Handler handler){ this.handler=handler; } },16,public class UseLong implements Handler{ private Handler handler; private long result=1 ; public void compuerMultiply(String number){ try{ long n=Long.parseLong(number); long i=1; while(i=n){ result=result*i; if(result=0){ System.out.println(“超出我的能力范圍,我計(jì)算不了“); puerMultiply(number); return; } i++; } System.out.println(number+“的階乘:“+result); } catch(NumberFormatException exp){ System.out.println(exp.toString()); } } public void setNextHandler(Handler handler){ this.handler=handler; } },17,import java.math.BigInteger; public class UseBigInteger implements Handler{ private Handler handler; private BigInteger result=new BigInteger(“1“) ; public void compuerMultiply(String number){ try{ BigInteger n=new BigInteger(number); BigInteger ONE=new BigInteger(“1“); BigInteger i=ONE; while(pareTo(n)=0){ result=result.multiply(i); i=i.add(ONE); } System.out.println(number+“??????:“+result); } catch(NumberFormatException exp){ System.out.println(exp.toString()); } } public void setNextHandler(Handler handler){ this.handler=handler; } },18,public class Application{ private Handler useInt,useLong,useBig; public void createChain(){ useInt=new UseInt(); useLong=new UseLong(); useBig=new UseBigInteger(); useInt.setNextHandler(useLong); useLong.setNextHandler(useBig); } public void reponseClient(String number){ useIpuerMultiply(number); } public static void main(String args[]){ Application application=new Application(); application.createChain(); application.reponseClient(“32“); } },19,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
20 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 軟件 體系結(jié)構(gòu) 設(shè)計(jì) 模式 責(zé)任 ppt 課件
鏈接地址:http://www.820124.com/p-1925303.html