责任链模式 和观察者模式
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
責(zé)任鏈模式平常沒(méi)怎么用過(guò),今天看到了責(zé)任鏈模式的基本構(gòu)成。大體就是把一件事情分給n個(gè)互相有引用的類(lèi)去執(zhí)行。比如解析ip地址。過(guò)程如圖:
?
package?com.cn.test;import?java.util.Random;/***?Created?by?user?on?2015/9/17.*/ public?abstract??class?DnsServer?{private?DnsServer?upper;public??final?Recorder?resolver(String?domain){Recorder?recorder=null;if(isLocal(domain)){recorder=echo(domain);}else?{recorder=upper.resolver(domain);}return?recorder;}public?void?setUpperServer(DnsServer?_upperServer){this.upper=_upperServer;}protected??abstract??boolean?isLocal(String?domain);protected??Recorder?echo(String?domain){Recorder?recorder=new?Recorder();recorder.setIp(getIpAddress());recorder.setDomain(domain);return?recorder;} private?String?getIpAddress(){Random?random?=new?Random();String?address=random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255);return?address; }}?package?com.cn.test;/***?Created?by?user?on?2015/9/17.*/ public?class?SHDnsServer?extends??DnsServer?{@Overrideprotected?boolean?isLocal(String?domain)?{return?domain.endsWith(".sh.cn");}protected??Recorder?echo(String?domain){Recorder?recorder=super.echo(domain);recorder.setOwner("上海服務(wù)器");recorder.setDomain(domain);return?recorder;} }package?com.cn.test;/***?Created?by?user?on?2015/9/17.*/ public?class?ChinaTopDnsServer?extends??DnsServer?{@Overrideprotected?boolean?isLocal(String?domain)?{return?domain.endsWith(".cn");}protected??Recorder?echo(String?domain){Recorder?recorder=super.echo(domain);recorder.setOwner("中國(guó)服務(wù)器");recorder.setDomain(domain);return?recorder;} }package?com.cn.test;import?java.io.BufferedReader; import?java.io.InputStreamReader;/***?Created?by?user?on?2015/9/17.*/ public?class?TopDnsServer??extends??DnsServer?{@Overrideprotected?boolean?isLocal(String?domain)?{return?domain.endsWith(".cn");}protected??Recorder?echo(String?domain){Recorder?recorder=super.echo(domain);recorder.setOwner("定級(jí)服務(wù)器");recorder.setDomain(domain);return?recorder;}public?static??void??main(String[]?args)?throws?Exception{DnsServer?shdnsServer?=?new?SHDnsServer();DnsServer?chinaServer?=new?ChinaTopDnsServer();DnsServer?topDnsServer?=new?TopDnsServer();chinaServer.setUpperServer(topDnsServer);shdnsServer.setUpperServer(chinaServer);System.out.println("解析過(guò)程開(kāi)始---------------");while(true){System.out.println("\n輸入域名,n退出");String?domain?=(new?BufferedReader(new?InputStreamReader(System.in))).readLine();if(domain.equalsIgnoreCase("n")){return;}else{Recorder?recorder=shdnsServer.resolver(domain);System.out.println("解析結(jié)果------------");System.out.println(recorder);}}}}結(jié)果:
解析過(guò)程開(kāi)始---------------
輸入域名,n退出
www.baidu.cn
解析結(jié)果------------
域名:www.baidu.cn
IP地址:217.131.195.29
解析者:中國(guó)服務(wù)器
輸入域名,n退出
www.baidu.sh.cn
解析結(jié)果------------
域名:www.baidu.sh.cn
IP地址:91.109.63.60
解析者:上海服務(wù)器
輸入域名,n退出
n
?
?
?
觀察者模式可以和責(zé)任鏈模式結(jié)合,這種結(jié)合的好處就是能夠屏蔽一些責(zé)任鏈的細(xì)節(jié),把責(zé)任鏈的低端(上海服務(wù)器)給觀察者,那么責(zé)任就沿著鏈一直上傳解決。
package?com.cn.test;import?java.util.Observable; import?java.util.Observer; import?java.util.Random;/***?Created?by?user?on?2015/9/17.*/ public??abstract??class?DnsServerObserver?extends?Observable?implements?Observer{public??void?update(Observable?arg0,Object?arg1){Recorder?recorder=(Recorder)arg1;if(isLocal(recorder)){recorder.setIp(getIpAddress());}else{responseFromUpperServer(recorder);}sign(recorder);}protected?abstract?void?sign(Recorder?recorder);public??void?setUpperServer(DnsServerObserver?dnsServer){super.deleteObservers();super.addObserver(dnsServer);}private???void?responseFromUpperServer(Recorder?recorder){super.setChanged();;super.notifyObservers(recorder);}protected??abstract??boolean?isLocal(Recorder?domain);protected??Recorder?echo(String?domain){Recorder?recorder=new?Recorder();recorder.setIp(getIpAddress());recorder.setDomain(domain);return?recorder;}private?String?getIpAddress(){Random?random?=new?Random();String?address=random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255);return?address;}}?package?com.cn.test;/***?Created?by?user?on?2015/9/17.*/ public?class?SHDnsServer1?extends?DnsServerObserver?{@Overrideprotected?void?sign(Recorder?recorder)?{recorder.setOwner("上海服務(wù)器");}@Overrideprotected?boolean?isLocal(Recorder?domain)?{return?domain.getDomain().endsWith(".sh.cn");} }package?com.cn.test;/***?Created?by?user?on?2015/9/17.*/ public?class?ChinaTopDnsServer1?extends?DnsServerObserver?{@Overrideprotected?void?sign(Recorder?recorder)?{recorder.setOwner("中國(guó)服務(wù)器");}@Overrideprotected?boolean?isLocal(Recorder?domain)?{return?domain.getDomain().endsWith(".cn");} }package?com.cn.test;import?java.io.BufferedReader; import?java.io.InputStreamReader;/***?Created?by?user?on?2015/9/17.*/ public?class?TopDnsServer1?extends?DnsServerObserver?{@Overrideprotected?void?sign(Recorder?recorder)?{recorder.setOwner("定級(jí)服務(wù)器");}@Overrideprotected?boolean?isLocal(Recorder?domain)?{return?true;}public?static??void?main(String[]?args)?throws?Exception{DnsServerObserver?shdnsServer?=?new?SHDnsServer1();DnsServerObserver?chinaServer?=new?ChinaTopDnsServer1();DnsServerObserver?topDnsServer?=new?TopDnsServer1();chinaServer.setUpperServer(topDnsServer);shdnsServer.setUpperServer(chinaServer);System.out.println("解析過(guò)程開(kāi)始---------------");while(true){System.out.println("\n輸入域名,n退出");String?domain?=(new?BufferedReader(new?InputStreamReader(System.in))).readLine();if(domain.equalsIgnoreCase("n")){return;}else{/*??Recorder?recorder=shdnsServer.resolver(domain);*/Recorder?recorder?=new?Recorder();recorder.setDomain(domain);shdnsServer.update(null,recorder);System.out.println("解析結(jié)果------------");System.out.println(recorder);}}} }?
該模式的缺陷就是不會(huì)知道具體的哪個(gè)服務(wù)器解析了域名,只返回時(shí)上海服務(wù)器解析了域名(因?yàn)樯虾7?wù)器作為了觀察者去處理請(qǐng)求)。
?
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/zjItLife/blog/507790
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的责任链模式 和观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于ASP.NET的web.config
- 下一篇: Ehcache 整合Spring 使用页