JDK中关于观察者模式主要了解俩个概念

  1. Observer观察者
  2. 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观察者模式相关推荐

  1. java jdk 观察者模式_java观察者模式实现和java观察者模式演化

    简单的观察者模式实现 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; impo ...

  2. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)决了当时的问题,那时LZ接触JAVA刚几个月,比葫芦画瓢的用了观察者模式。...

    本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式. 说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙.当初LZ要做一个 ...

  3. java工作笔记021---Java设计模式_观察者模式_事件驱动模式

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 这个模式现在,觉得越来越有用了, 发现在一些springCloud项目中也有用的,一些前端,net, 后端java的 ...

  4. Spring事件驱动

    1. 事件驱动模型简介 1.1 概念 事件驱动模型,也即是我们通常说的观察者.基于发布-订阅模式的编程模型. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并 ...

  5. python事件处理函数_事件驱动的简明讲解(python实现)

    关键词:编程范式,事件驱动,回调函数,观察者模式 作者:码匠信龙 举个简单的例子: 有些人喜欢的某个公众号,然后去关注这个公众号,哪天这个公众号发布了篇新的文章,没多久订阅者就会在微信里收到这个公众号 ...

  6. 【12】行为型-观察者模式

    为什么80%的码农都做不了架构师?>>>    1.上下文及定义 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2.常用场 ...

  7. 面试官:关于Spring就问这13个

    1 Spring核心组件 一句话概括:Spring是一个轻量级.非入侵式的控制反转(IoC)和面向切面(AOP)的框架. Spring 版本 JDK版本 1.x 1.3:引入了动态代理机制,AOP 底 ...

  8. 面试中Spring常见问题

    1.什么是Spring框架 Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性. 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的 ...

  9. Spring常见面试题(13个面试题,回答超详细)

    马上开春了面试前必备技能啊,就算不背下来也得知道一些.免得尴尬. 目录 面试题一:Spring是什么? 面试题二:说说Spring 的优点? 面试题三:谈谈你对Spring的IOC理解? 面试题四:说 ...

最新文章

  1. 一个App完成入门篇(一)-从Hello world开始
  2. python多线程和多进程——python并行编程实验
  3. Spring Security学习(二)
  4. 给企业老总的一封信(一)
  5. poj 2051 Argus(优先队列)
  6. CAS和AtomicLong和LongAdder
  7. 挣钱其实是一门学问也一个门道
  8. 【Golang 快速入门】高级语法:反射 + 并发
  9. IDEA流式处理 Debug Stream Trace 控制面板
  10. 查看 java heapspace_Java heap space 问题查找
  11. iOS----------APP怎样做更安全
  12. nginx 配置支持URL HTML5 History 模式 与 设置代理
  13. 从零开始学Android(一)
  14. 恩施软件开发人员每月多少钱_软件开发人员外包报价表
  15. Python Selenium 抓取Shadow Dom内部元素方法更新
  16. 分享《Essential Linux Device Drivers》中文版高清电子版
  17. 定制交友盲盒软件 交友盲盒软件开发 交友软件系统开发
  18. 一篇我觉得不错的文章
  19. 什么样的台灯灯光是好的?推荐中性色温的护眼台灯
  20. Mindmanager2020教程篇画一个树状思维导图及试用密钥过期

热门文章

  1. ORACLE物理DG日常管理
  2. web.xml 文件中的配置节的加载顺序
  3. mySQL教程 第5章 插入 更新与删除数据
  4. 管理日志--项目管理科学的产生与发展
  5. 在IIS中寄存已有WCF服务
  6. 又一游戏大盗(完美世界、跑跑等)SysInfo1.dll
  7. Micro-CMS v1
  8. mammary cancer关联规则挖掘详解
  9. C++语法细节注意集锦
  10. 深度学习(三十五)——Style Transfer(2), YOLOv3, Tiny-YOLO, One-stage vs. Two-stage