触发链模式之使用jdk的Observable和Observerver实现触发链模式(附JDK源码)
首先看看JDK的Observer接口
public interface Observer {
void update(Observable o, Object arg);
}
也就一个更新的方法,这里是要写自己要处理事情的逻辑(代码干活的地方)
然后就是Observable类,因为方法过多不好阅读,所以直接看大纲
方法大概就是设置改变状态,设置观察者,通知观察者等等....
我这里就说明下通知观察者的方法
public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
} for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
简单点也就是去调用Observer接口的Update方法
弄懂这些就可以实现一个触发链模式了,代码如下(DNS解析的一个简单的实现)
执行图:
UML示例图:
观察者抽象:
package zen.design.pattern.creat.观察者模式.DNS解析; import java.util.Observable;
import java.util.Observer;
import java.util.Random; /**
* <p>既是观察者也是被观察者</p>
*
* @作者 five-five
* @创建时间 2020/8/11
*/
public abstract class DnsServer extends Observable implements Observer {
//处理请求,也就是接收到事件后的处理
@Override
public void update(Observable o, Object arg) {
Recorder recorder = (Recorder) arg;
if (isLocal(recorder)) {
recorder.setIp(generateIpAddress());
} else {
responsFromUpperServer(recorder);
}
sign(recorder);
} private String generateIpAddress() {
Random random = new Random();
return random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255) + "." + "." + random.nextInt(255);
} void setUpper(DnsServer dnsServer) {
super.deleteObservers();
super.addObserver(dnsServer);
} private void responsFromUpperServer(Recorder recorder) {
super.setChanged();
super.notifyObservers(recorder);
} abstract void sign(Recorder recorder); protected abstract boolean isLocal(Recorder recorder);
}
观察者实现类:
package zen.design.pattern.creat.观察者模式.DNS解析; /**
* @作者 five-five
* @创建时间 2020/8/11
*/
public class ChinaTopDnserver extends DnsServer {
@Override
void sign(Recorder recorder) {
recorder.setOwner("中国");
} @Override
protected boolean isLocal(Recorder recorder) {
return recorder.getDomain().endsWith(".cn");
}
}
package zen.design.pattern.creat.观察者模式.DNS解析; /**
* @作者 five-five
* @创建时间 2020/8/11
*/
public class SHDnserver extends DnsServer {
@Override
void sign(Recorder recorder) {
recorder.setOwner("上海");
} @Override
protected boolean isLocal(Recorder recorder) {
return recorder.getDomain().endsWith(".sh");
}
}
package zen.design.pattern.creat.观察者模式.DNS解析; /**
* @作者 five-five
* @创建时间 2020/8/11
*/
public class TopDnserver extends DnsServer {
@Override
void sign(Recorder recorder) {
recorder.setOwner("全球");
} @Override
protected boolean isLocal(Recorder recorder) {
return true;
}
}
然后就是操作的实体类
package zen.design.pattern.creat.观察者模式.DNS解析; /**
* @作者 five-five
* @创建时间 2020/8/11
*/
public class Recorder {
//持有者
private String owner; //域名 private String domain;
//IP地址
private String ip;
public Recorder() {
} public void setDomain(String domain) {
this.domain = domain;
} public void setIp(String ip) {
this.ip = ip;
} public void setOwner(String owner) {
this.owner = owner;
} public String getOwner() {
return owner;
} public String getDomain() {
return domain;
} public String getIp() {
return ip;
} @Override
public String toString() {
return "Recorder{" +
"owner='" + owner + '\'' +
", domain='" + domain + '\'' +
", ip='" + ip + '\'' +
'}';
} public Recorder(String domain, String ip) {
this.domain = domain;
this.ip = ip;
}
}
测试代码:
package zen.design.pattern.creat.观察者模式.DNS解析; /**
* @作者 five-five
* @创建时间 2020/8/11
*/
public class Client {
public static void main(String[] args) {
DnsServer shdns = new SHDnserver();
DnsServer cndns = new ChinaTopDnserver();
DnsServer topdns = new TopDnserver();
cndns.setUpper(topdns);
shdns.setUpper(cndns);
Recorder recorder = new Recorder();
recorder.setDomain(".cf");
shdns.update(null,recorder);
System.out.println(recorder);
}
}
测试结果:
触发链模式之使用jdk的Observable和Observerver实现触发链模式(附JDK源码)的更多相关文章
- 鸿蒙内核源码分析(工作模式篇) | CPU是韦小宝,七个老婆 | 百篇博客分析OpenHarmony源码 | v36.04
百篇博客系列篇.本篇为: v36.xx 鸿蒙内核源码分析(工作模式篇) | CPU是韦小宝,七个老婆 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CP ...
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...
- 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码
一.什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BaseP ...
- PHP伪造referer突破网盘禁止外链(附115源码)
新建一个文件file.php.后面的参数就是需要伪造referfer的目标地址吧.如:file.php/http://www.xxx.xxx/xxx.mp3 复制内容到剪贴板 代码: <?$ur ...
- [区块链\理解BTCD源码]GO语言实现一个区块链原型
摘要 本文构建了一个使用工作量证明机制(POW)的类BTC的区块链.将区块链持久化到一个Bolt数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作.这篇文章目的是希望帮助大家理解 ...
- eclipse无法断点调试JDK源码的问题
最近换了新版的eclipse,在jdk源码里面,打断点发现无法进入源码调试,程序直接跳过,已查资料发现自己eclipse配置的是jre环境的. 此处要配成jdk目录才有效 打开preferences, ...
- 曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)
背景 大家知道,jdk安装的目录下,一般会有个src.zip包,这个包基本对应了rt.jar这个包.rt.jar这个包里面,就放了jdk中,jdk采用java实现的那部分类库代码,比如java.lan ...
- Mybatis源码手记-从缓存体系看责任链派发模式与循环依赖企业级实践
一.缓存总览 Mybatis在设计上处处都有用到的缓存,而且Mybatis的缓存体系设计上遵循单一职责.开闭原则.高度解耦.及其精巧,充分的将缓存分层,其独到之处可以套用到很多类似的业务上.这里将主要 ...
- 设计模式(十八)——观察者模式(JDK Observable源码分析)
1 天气预报项目需求,具体要求如下: 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2) 需要设计开放型 API,便于其他第三方也能接入气象 ...
随机推荐
- Python Ethical Hacking - MODIFYING DATA IN HTTP LAYER(3)
Recalculating Content-Length: #!/usr/bin/env python import re from netfilterqueue import NetfilterQu ...
- 洛谷P2365/5785 任务安排 题解 斜率优化DP
任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...
- 微信小程序实战:表单与选择控件的结合
先上代码. login.wxml <mp-toptips msg="{{error}}" type="error" show="{{error} ...
- JavaScript中的var,const,let区别与用法(浅谈)
let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...
- 抛出这8个问题,检验一下你到底会不会ThreadLocal,来摸个底~
0.问题 和Synchronized的区别 存储在jvm的哪个区域 真的只是当前线程可见吗 会导致内存泄漏么 为什么用Entry数组而不是Entry对象 你学习的开源框架哪些用到了ThreadLoca ...
- 高效C++:资源管理
C++中资源泄漏一直都是老大难的问题,特别是在嵌入式环境中,一点点的资源泄漏,加上长时间的运行们就会导致程序崩溃,这种问题定位非常困难,无规律偶发.解决问题的一种方式是使用特定工具检查内存泄漏,优点是 ...
- Docker 入门教程(1)——安装
docker大名听说了很久,一直没有去研究过,但现在面试动不动要求docker,还是研究下吧.由于我的电脑是win10系统(穷,买不起mac),安装过程各种坑爹问题不断,一度都想放弃,所以说垃圾win ...
- APP自动化 -- 滑动解锁、滑动验证
一.解锁 1.代码 2.效果 1)执行效果 2)点位效果
- 第33课 C++中的字符串
1. 历史遗留问题及解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串------c语言是用字符数组实现字符串 ②C语言用字符数组和一组函数模拟字符串操作 ③C语言不支持自定义类型,因此无 ...
- luogu P5325 Min_25筛
LINK:Min_25筛 新版感觉有点鬼畜 而且旧版的也够用了至少. 这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的. (误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几 ...