首先看看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. Python Ethical Hacking - MODIFYING DATA IN HTTP LAYER(3)

    Recalculating Content-Length: #!/usr/bin/env python import re from netfilterqueue import NetfilterQu ...

  2. 洛谷P2365/5785 任务安排 题解 斜率优化DP

    任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...

  3. 微信小程序实战:表单与选择控件的结合

    先上代码. login.wxml <mp-toptips msg="{{error}}" type="error" show="{{error} ...

  4. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  5. 抛出这8个问题,检验一下你到底会不会ThreadLocal,来摸个底~

    0.问题 和Synchronized的区别 存储在jvm的哪个区域 真的只是当前线程可见吗 会导致内存泄漏么 为什么用Entry数组而不是Entry对象 你学习的开源框架哪些用到了ThreadLoca ...

  6. 高效C++:资源管理

    C++中资源泄漏一直都是老大难的问题,特别是在嵌入式环境中,一点点的资源泄漏,加上长时间的运行们就会导致程序崩溃,这种问题定位非常困难,无规律偶发.解决问题的一种方式是使用特定工具检查内存泄漏,优点是 ...

  7. Docker 入门教程(1)——安装

    docker大名听说了很久,一直没有去研究过,但现在面试动不动要求docker,还是研究下吧.由于我的电脑是win10系统(穷,买不起mac),安装过程各种坑爹问题不断,一度都想放弃,所以说垃圾win ...

  8. APP自动化 -- 滑动解锁、滑动验证

    一.解锁 1.代码 2.效果 1)执行效果 2)点位效果

  9. 第33课 C++中的字符串

    1. 历史遗留问题及解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串------c语言是用字符数组实现字符串 ②C语言用字符数组和一组函数模拟字符串操作 ③C语言不支持自定义类型,因此无 ...

  10. luogu P5325 Min_25筛

    LINK:Min_25筛 新版感觉有点鬼畜 而且旧版的也够用了至少. 这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的. (误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几 ...