首先看看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源码)的更多相关文章

  1. 鸿蒙内核源码分析(工作模式篇) | CPU是韦小宝,七个老婆 | 百篇博客分析OpenHarmony源码 | v36.04

    百篇博客系列篇.本篇为: v36.xx 鸿蒙内核源码分析(工作模式篇) | CPU是韦小宝,七个老婆 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CP ...

  2. 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析

    前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈.      什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...

  3. 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码

    一.什么是PO模式 全称:page object model  简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! ​ 主要分三层: 1.基础层BaseP ...

  4. PHP伪造referer突破网盘禁止外链(附115源码)

    新建一个文件file.php.后面的参数就是需要伪造referfer的目标地址吧.如:file.php/http://www.xxx.xxx/xxx.mp3 复制内容到剪贴板 代码: <?$ur ...

  5. [区块链\理解BTCD源码]GO语言实现一个区块链原型

    摘要 本文构建了一个使用工作量证明机制(POW)的类BTC的区块链.将区块链持久化到一个Bolt数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作.这篇文章目的是希望帮助大家理解 ...

  6. eclipse无法断点调试JDK源码的问题

    最近换了新版的eclipse,在jdk源码里面,打断点发现无法进入源码调试,程序直接跳过,已查资料发现自己eclipse配置的是jre环境的. 此处要配成jdk目录才有效 打开preferences, ...

  7. 曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)

    背景 大家知道,jdk安装的目录下,一般会有个src.zip包,这个包基本对应了rt.jar这个包.rt.jar这个包里面,就放了jdk中,jdk采用java实现的那部分类库代码,比如java.lan ...

  8. Mybatis源码手记-从缓存体系看责任链派发模式与循环依赖企业级实践

    一.缓存总览 Mybatis在设计上处处都有用到的缓存,而且Mybatis的缓存体系设计上遵循单一职责.开闭原则.高度解耦.及其精巧,充分的将缓存分层,其独到之处可以套用到很多类似的业务上.这里将主要 ...

  9. 设计模式(十八)——观察者模式(JDK Observable源码分析)

    1 天气预报项目需求,具体要求如下: 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2) 需要设计开放型 API,便于其他第三方也能接入气象 ...

随机推荐

  1. Guava集合--新集合类型

    Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...

  2. 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster

    前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...

  3. Maven原理学习

    文章目录 一.Maven概述 二.maven依赖管理 三.maven文件结构 四.maven仓库的种类以及彼此联系 五.maven标准目录结构 六.mvn命令 七.maven生命周期 八.maven的 ...

  4. python dict乱码如何解决

    定义字典并直接输出,结果输出结果中文是乱码展示 d={'name':'lily','age':18,'sex':'女','no':1121} print d 输出结果: {'age': 18, 'no ...

  5. springboot(七)JavaMail发送邮件

    JavaMail简介: JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件 ...

  6. [leetcode/lintcode 题解] 谷歌面试题:找出有向图中的弱连通分量

    请找出有向图中弱连通分量.图中的每个节点包含 1 个标签和1 个相邻节点列表.(有向图的弱连通分量是任意两点均有有向边相连的极大子图) 将连通分量内的元素升序排列. 在线评测地址:https://ww ...

  7. 一个在raw里面放着数据库文件的网上例子

    https://www.cnblogs.com/yutingliuyl/p/6880103.html

  8. Java数据结构和算法(2)之稀疏数组

    1.定义 稀疏数组可以看做是普通二位数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组,关于稀疏数组的运用有五子棋盘,地图等.. *当一个数组中大部分元素为0,或者为同一个值的数组时 ...

  9. 可能会用的到的JQ插件

    ├─lib │ jquery jQuery类库(v1.9.1) │ bootstrapSwitch 开关控件 │ Hui-iconfont_v1.0 阿里图标字体库(H-ui定制) │ font-aw ...

  10. Python编程入门(第3版) PDF|百度网盘下载内附提取码

    Python编程入门(第3版)是图文并茂的Python学习参考书,书中并不包含深奥的理论或者高级应用,而是以大量来自实战的例子.屏幕图和详细的解释,用通俗易懂的语言结合常见任务,对Python的各项基 ...