事件驱动之JDK观察者模式
JDK中关于观察者模式主要了解俩个概念
- Observer观察者
- Observable事件源;当事件源发生某事件时,有两个事情需要注意 1.里面有一个isChange属性 当为false时不会发通知给观察者。所以一般先setChange为true,然后注册观察者,再调用notifyObservers方法 通知所有观察者中的update方法
代码:
定义一个观察者:
public class EmailObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {if (o instanceof PaymentStatusObservable) {System.out.println("更新订单事件源");}System.out.println("邮件服务搜到通知..." + arg);}}
定义一个事件源
/** *此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。<P>注意点: Observable实现了大部分的逻辑,没有很好地进行抽象,灵活性降低了存在2个潜在的问题:一个刚刚加入的观察者错过了通知;一个刚刚删除的观察者被错误的通知Observable实现的方法采用synchronized,操作同一个方法时串行,可能会存在效率问题*/ public class PaymentStatusObservable extends Observable {public void updatePaymentStatus(int status) {System.out.println("更新支付状态为:" + status);this.setChanged();/*** 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于:notifyObservers(null)*/this.notifyObservers();
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;
synchronized (this) {
/* We don't want the Observer doing callbacks into
* arbitrary code while holding its own Monitor.
* The code where we extract each Observable from
* the Vector and store the state of the Observer
* needs synchronization, but notifying observers
* does not (should not). The worst result of any
* potential race-condition here is that:
* 1) a newly-added Observer will miss a
* notification in progress
* 2) a recently unregistered Observer will be
* wrongly notified when it doesn't care
*/
if (!changed)
return;
arrLocal = obs.toArray();//得到事先加入的vector的观察者
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);//更新观察者的update方法
}
} }
demo:
public class ClientDemo {public static void main(String[] args) {// 被观察者。即事件源PaymentStatusObservable paymentStatusObservable = new PaymentStatusObservable();// 如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者paymentStatusObservable.addObserver(new EmailObserver()); /***源码解析
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
*/paymentStatusObservable.updatePaymentStatus(1);} }
outPut:
更新支付状态为:1
更新订单事件源
邮件服务搜到通知...null
转载于:https://www.cnblogs.com/zhangfengshi/p/9397519.html
事件驱动之JDK观察者模式相关推荐
- java jdk 观察者模式_java观察者模式实现和java观察者模式演化
简单的观察者模式实现 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; impo ...
- (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)决了当时的问题,那时LZ接触JAVA刚几个月,比葫芦画瓢的用了观察者模式。...
本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式. 说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙.当初LZ要做一个 ...
- java工作笔记021---Java设计模式_观察者模式_事件驱动模式
技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 这个模式现在,觉得越来越有用了, 发现在一些springCloud项目中也有用的,一些前端,net, 后端java的 ...
- Spring事件驱动
1. 事件驱动模型简介 1.1 概念 事件驱动模型,也即是我们通常说的观察者.基于发布-订阅模式的编程模型. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并 ...
- python事件处理函数_事件驱动的简明讲解(python实现)
关键词:编程范式,事件驱动,回调函数,观察者模式 作者:码匠信龙 举个简单的例子: 有些人喜欢的某个公众号,然后去关注这个公众号,哪天这个公众号发布了篇新的文章,没多久订阅者就会在微信里收到这个公众号 ...
- 【12】行为型-观察者模式
为什么80%的码农都做不了架构师?>>> 1.上下文及定义 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2.常用场 ...
- 面试官:关于Spring就问这13个
1 Spring核心组件 一句话概括:Spring是一个轻量级.非入侵式的控制反转(IoC)和面向切面(AOP)的框架. Spring 版本 JDK版本 1.x 1.3:引入了动态代理机制,AOP 底 ...
- 面试中Spring常见问题
1.什么是Spring框架 Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性. 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的 ...
- Spring常见面试题(13个面试题,回答超详细)
马上开春了面试前必备技能啊,就算不背下来也得知道一些.免得尴尬. 目录 面试题一:Spring是什么? 面试题二:说说Spring 的优点? 面试题三:谈谈你对Spring的IOC理解? 面试题四:说 ...
最新文章
- 一个App完成入门篇(一)-从Hello world开始
- python多线程和多进程——python并行编程实验
- Spring Security学习(二)
- 给企业老总的一封信(一)
- poj 2051 Argus(优先队列)
- CAS和AtomicLong和LongAdder
- 挣钱其实是一门学问也一个门道
- 【Golang 快速入门】高级语法:反射 + 并发
- IDEA流式处理 Debug Stream Trace 控制面板
- 查看 java heapspace_Java heap space 问题查找
- iOS----------APP怎样做更安全
- nginx 配置支持URL HTML5 History 模式 与 设置代理
- 从零开始学Android(一)
- 恩施软件开发人员每月多少钱_软件开发人员外包报价表
- Python Selenium 抓取Shadow Dom内部元素方法更新
- 分享《Essential Linux Device Drivers》中文版高清电子版
- 定制交友盲盒软件 交友盲盒软件开发 交友软件系统开发
- 一篇我觉得不错的文章
- 什么样的台灯灯光是好的?推荐中性色温的护眼台灯
- Mindmanager2020教程篇画一个树状思维导图及试用密钥过期