责任链模式 和观察者模式
2019独角兽企业重金招聘Python工程师标准>>>
责任链模式平常没怎么用过,今天看到了责任链模式的基本构成。大体就是把一件事情分给n个互相有引用的类去执行。比如解析ip地址。过程如图:
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("上海服务器");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("中国服务器");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("定级服务器");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("解析过程开始---------------");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("解析结果------------");System.out.println(recorder);}}}}
结果:
解析过程开始---------------
输入域名,n退出
www.baidu.cn
解析结果------------
域名:www.baidu.cn
IP地址:217.131.195.29
解析者:中国服务器
输入域名,n退出
www.baidu.sh.cn
解析结果------------
域名:www.baidu.sh.cn
IP地址:91.109.63.60
解析者:上海服务器
输入域名,n退出
n
观察者模式可以和责任链模式结合,这种结合的好处就是能够屏蔽一些责任链的细节,把责任链的低端(上海服务器)给观察者,那么责任就沿着链一直上传解决。
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("上海服务器");}@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("中国服务器");}@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("定级服务器");}@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("解析过程开始---------------");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("解析结果------------");System.out.println(recorder);}}}
}
该模式的缺陷就是不会知道具体的哪个服务器解析了域名,只返回时上海服务器解析了域名(因为上海服务器作为了观察者去处理请求)。
转载于:https://my.oschina.net/zjItLife/blog/507790
责任链模式 和观察者模式相关推荐
- java实现责任链模式_我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式之行为型:责任链模式
背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...
- 设计模式--责任链模式--Java实现
设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...
- 设计模式的C语言应用-责任链模式-第三章
模式介绍 责任链将需要触发的对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它或者直到最后也没有对象处理而留在链末尾端. 图表 1责任链模式流程图 责任链在C ...
- 设计模式之责任链模式(Chain of Responsibility )
责任链的目的是通过特定的设计对请求者和接收者之间进行解耦,请求者调用操作的对象,接收者接收请求并执行相关操作,通过解耦请求者不需要关心接收者的接口,同时也可增强职责的灵活性,通过改变链内的成员或调用次 ...
- 简易理解设计模式之:责任链模式——OA中请假流程示例
介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...
- 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)
文章目录 前言 一.责任链模式定义 二.责任链模式结构 三.责任链高级应用 四.责任链模式优缺点 设计模式系列文章 结尾 前言 作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门 ...
- java里面的环链怎么做_Java模式开发之责任链模式
从前往后按照一定操作顺序进行 申明一个过滤器接口,里面有一个"方法申明" 叫 规则过滤,返回处理后的结果 申明一些具体的操作类,全部实现过滤器接口,重写里头规则过滤的方法,返回规 ...
- 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别
状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...
最新文章
- 沈阳人才市场7月精品招聘会
- 孙剑:旷视不需要用冠军证明自己;看好自动机器学习技术
- Labview通过RS422通讯接口PC与下位机通信
- 用Visual C++实现远程线程嵌入技术
- js拼的onclick调用方法需要注意的地方 之二
- 2020 版 Python 数据清理终极指南!
- G2.9 std_alloc
- oracle存储过程可以回退吗,Navicat 运行 Oracle 存储过程示例
- IDEA中使用JUnit4(单元测试框架)超详细!
- 大陆身份证号码正则验证js脚本
- 评测 AlibabaCloud 阿里云国际版 香港轻量云服务器的性能和网络怎么样
- 计算机计算累计公式,““请问Excel表格求的合计数为什么和用计算器累加出的合计数不一致...
- 将vim打造成强大的python和c的ide
- Twitter 没有在美国总统竞选期间宕机
- Exchange-获取主、所有SMTP地址
- 分子生物学总结完整版
- Apache AzKaban 环境搭建与入门使用
- 【Python】文件选择框选择文件
- iOS 应用图标 屏幕尺寸
- layui 表格行单击事件选中行前的单选框