系列文描述:

  该文章是日常笔记系列的第二篇,此乃第一节,主要记录了开发中如何基于Java使用观察者模式,相信看完肯定有所收获。

基于Java实现观察者模式

作用描述:

在日常研发过程总会遇见业务A随着业务B发生相关变化的情况,这种情况便可以运用观察者模式,而对于观察者模式,Java已经为我们提供了已有的接口和类方便我们使用。

对于订阅者Java为我们提供了一个接口,JDK源码如下:

public interface Observer {void update(Observable var1, Object var2);}
复制代码

可以看出,此处仅提供一个update方法用于接收通知者的通知做出相应改变。 在实际业务中,实现观察者模式的订阅者只需要实现该接口并实现update接口实现业务即可。

场景代码如下:

再来看看Java提供了一个怎样的通知者,可以看到JDK源码如下:

public class Observable {private boolean changed = false;//  存放Observer的容器,本身是安全的,看了源码,内部实现的大部分函数都使用了synchronizedprivate Vector<Observer> obs = new Vector();public Observable() {}// 为通知者添加订阅者的地方public synchronized void addObserver(Observer var1) {if (var1 == null) {throw new NullPointerException();} else {if (!this.obs.contains(var1)) {this.obs.addElement(var1);}}}public synchronized void deleteObserver(Observer var1) {this.obs.removeElement(var1);}public void notifyObservers() {this.notifyObservers((Object)null);}public void notifyObservers(Object var1) {Object[] var2;synchronized(this) {if (!this.changed) {return;}var2 = this.obs.toArray();this.clearChanged();}for(int var3 = var2.length - 1; var3 >= 0; --var3) {((Observer)var2[var3]).update(this, var1);}}public synchronized void deleteObservers() {this.obs.removeAllElements();}protected synchronized void setChanged() {this.changed = true;}protected synchronized void clearChanged() {this.changed = false;}public synchronized boolean hasChanged() {return this.changed;}public synchronized int countObservers() {return this.obs.size();}
}
复制代码

首先我们可以从源码中看出Observable类使用Vector,Vector相比于ArrayList来说,它是线程安全的。其次,在多个函数上使用了synchronized关键字,这都是在为多线程考虑,避免出现在需要做出通知订阅者动作的时候因为数据紊乱出错的问题。 在实际业务中,直接继承该类即可,场景代码如下:

那么如何给监听者注册订阅者呢?场景代码如下:

而监听者通知订阅者的操作如下:

可以从上看出直接调用addObserver便可以给监听者注册订阅者,而在监听者发生变化的时候监听者调用setChange修改状态,之后调用notifyObservers通知,订阅者中的update实现便会被触发。

结尾说点什么

说好的一周一篇,上个周末沉迷docker的使用导致废了,然后最近又是每天都是差不多十二点下班,所以只能下班后花时间写总结最近的笔记了(  ̄▽ ̄)((≧︶≦)


系列博客可以关注公众号:

个人网站:myblog.lixifan.cn/

转载于:https://juejin.im/post/5c9b9e0af265da612647cb9e

Java日常干货-观察者模式相关推荐

  1. Java 设计模式之观察者模式

    一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...

  2. 计算机二级循环储存,【日常干货】计算机二级基础知识(第三期)

    原标题:[日常干货]计算机二级基础知识(第三期) 即便是周末 也不要忘了学习哦 1.下列结构中属于线性结构链式存储的是 A)双向链表 B)循环队列 C)二叉链表 D)二维数组 ▼ A[解析]双向链表也 ...

  3. Java多线程干货系列(1):Java多线程基础

    转载自  Java多线程干货系列(1):Java多线程基础 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学 ...

  4. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  5. java日常笔记、对象的创建完全是由构造方法实现的吗?this的本质

    java日常笔记.对象的创建完全是由构造方法实现的吗 不完全是构造方法是创建java对象重要途径,通过new关键字调用构造器时,构造器也确实返 回了该对象,但这个对象并不是完全由构造器负责创建的,创建 ...

  6. 设计模式:java及spring观察者模式(有利于代码解耦)

    http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext?  它是Spring的核心,Context我们通常解释为上下文 ...

  7. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  8. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. [附源码]计算机毕业设计JAVA日常饮食健康推荐系统

    [附源码]计算机毕业设计JAVA日常饮食健康推荐系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(In ...

  10. Java设计模式:观察者模式

    观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...

最新文章

  1. 《游戏服务器的架构演进》阅读笔记
  2. HTML5中各种标签总结(body标签)
  3. spring 获取url参数
  4. python基础之网络基础
  5. 计算机过去和现在的变化英语作文,自己过去和现在的变化英语作文带翻译
  6. iBatis.Net(6):Data Map(深入)
  7. 面试—每日一题(5)
  8. mysql主节点1593从节点正常_keepalived+双主架构
  9. Visio 不能使用方向键移动图形的解决办法
  10. 11.看板方法---建立服务水平协议
  11. 解决lenovo V470 安装win8 无法重启、关机故障
  12. CTF-bacon(培根密码)
  13. 【机器视觉运动控制一体机小课堂】三分钟对图像进行ROI创建
  14. 使用经验-深度学习云服务器mist GPU
  15. Linux下使用Intel_WiFi_Link_5100AGN 破解无线加密
  16. 《学Unity的猫》——第十九集:皮皮猫上班第一天,认识游戏开发公司各个部门
  17. via导出书签html,书签助手,迈出换用 Via 浏览器的第一步 | App+1
  18. TCAM路由器查表技术分析
  19. JS解混淆-AST还原案例
  20. 谷底飞龙的技术博客集

热门文章

  1. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar
  2. 想转行做web前端工程师,必学这6大技能
  3. Component 初识组件
  4. [原创]spring及springmvc精简版--继承数据源,声明式事物
  5. parawork平台介绍
  6. Linq to xml修改CDATA节点值
  7. javascript 常用方法 解析URL,补充前导字符, 省市联动, 循环替换模板
  8. % 取余运算 取模运算
  9. HTTP Keep-Alive详解[转]
  10. Activity的任务栈Task以及启动模式与Intent的Flag详解