观察者模式 让你的对象知悉现况

观察者模式可以说是JDK中使用最多的模式了,有了他,你将会消息灵通。

定义

观察者模式定义了对象之间的的一对多依赖,当一个对象发生变化时候,他的所有所有依赖者都会收到通知并自动更新。
如下图:

主题和观察者定义了一对多的关系,观察者依赖于此主题,只要主题发生变化,观察者就会被通知,观察者有可能根据通知的风格更新自己的内容。
在生活中就像报社与订阅者的关系,只要报社有新报纸,就会派送给所有订阅者,订阅者取消后就不会在收到报纸。

观察者模式的类图


下面我们来实现一个简单的的观察者模式的代码:
创建主题接口Subject:

package observer;public interface Subject {//观察者注册与移除public void registerObserver(Observer o);public void removeObserver(Observer o);//主题状态改变时通知所有观察者public void notifyObserver();
}

构造接口Observer,其中有update方法,为观察者收到主题改变通知时的更新曹操作:

package observer;public interface Observer {public void update(int value);}

主题实现类:NewValue:

package observer;import java.util.ArrayList;public class NewValue implements Subject {private ArrayList observers=null;private int value=0;public NewValue(ArrayList obs,int value) {this.value=value;this.observers=obs;}@Overridepublic void registerObserver(Observer o) {// TODO Auto-generated method stubobservers.add(o);}@Overridepublic void removeObserver(Observer o) {// TODO Auto-generated method stubobservers.remove(o);}@Overridepublic void notifyObserver() {// TODO Auto-generated method stubfor(int i=0;i<observers.size();i++) {Observer ob=(Observer) observers.get(i);ob.update(value);}}//改变value值,通知观察者public void changeValue(int v) {this.value=v;notifyObserver();}}

通过value改变时,通知所有观察者

操作显示接口,为观察者收到通知后可做出的反应,这里进定义一个display方法(用来输出value的值)

package observer;public interface Display {public void display();}

接着有两个实现观察者接口的类,A观察者与B观察者:

package observer;public class AObserver implements Observer,Display {private int value;public Subject sb;public AObserver(Subject subject ) {this.sb=subject;sb.registerObserver(this);//注册成为观察者}@Overridepublic void update(int value) {// TODO Auto-generated method stubthis.value=value;}@Overridepublic void display() {// TODO Auto-generated method stub//输出当前value值System.out.print(this.getClass().getName().toString()+"value:"+this.value+"\n");}}

B观察者与其类似,不再赘述,接着用一个观察者demo类来看其工作效果:

package observer;import java.util.ArrayList;public class ObserverDemo {public static void main(String[] args) {// TODO Auto-generated method stubArrayList obs=new ArrayList();NewValue nv=new NewValue(obs,0);//新建主题,value初始值为0//新建观察者A与BAObserver A= new AObserver(nv);BObserver B= new BObserver(nv);//输出观察者状态A.display();B.display();//改变主题value值为1nv.changeValue(1);//再输出观察者状态A.display();B.display();//移除观察者A,在改变主题value值为2nv.removeObserver(A);nv.changeValue(2);//再输出观察者状态A.display();B.display();        }}

结果输出如下:
`observer.AObservervalue:0
observer.BObservervalue:0
observer.AObservervalue:1
observer.BObservervalue:1
observer.AObservervalue:1
observer.BObservervalue:2
`
可以看到初始时A,B观察者到value值都为0,主题实现类实例改变value值为1时通知AB后,A,B观察者到value值都为1,将A观察者移除后,在该变value值为2,此时A观测到value仍未1,B则观察到为2.

设计模式之观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

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

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

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. 集成运算同相放大器和反向放大器的选择
  2. ztree 自定义参数_zTree树插件使用方法及自定义控件实践_蓝戒的博客
  3. Java Date Time 教程-java.sql.Timestamp
  4. ue4 怎么修改骨骼动画_UE4换装系统(合并骨骼模型)
  5. svn版本库浏览器_svn:版本库xxx不存在||svn:No such revision xxx的问题
  6. Numpy中stack(),hstack(),vstack()函数详解
  7. android+模拟器+ram,Android模拟器RAM修改方法 - 尤其是3.0
  8. command对象和DataReader的学习
  9. 大多数项目能不能投资,能不能去创业,取决于自己是站在什么高度看问题
  10. java 解码 encodeuri_encodeURIComponent编码后java后台的解码
  11. bug-Both weights and assigned values must be a sequence of numbers when assigning to values of <clas
  12. 蓝队应对攻击的常用策略二
  13. 嵌入式Qt(实验三)——Qt网络编程
  14. 国内ERP技术公司综合
  15. 三菱PLC5u与台达变频器modbus RTU通讯
  16. ITK VKT 安装-详细
  17. SD卡--摄像头中扩容卡原理及检测机制
  18. 恩格玛密码机的工作原理
  19. 运维分级发布_故障分级和处罚规范-运维必备规章制度
  20. python---面向对象实例(烤地瓜、搬家具)

热门文章

  1. python对象特性教学_Python三个面向对象特性多态性的实用解释,实践,解读,丨,三大,特征,之...
  2. ajax绑值,vue.js使用ajax绑定数据之post方法
  3. svg mysql_SVG介绍
  4. win7桌面图标计算机打不开,win7系统下双击电脑桌面图标打不开的解决方法
  5. Oracle查询对应表是否在使用,oracle 中查询当前用户可以看到的表名、表对应的所有字段...
  6. python执行脚本时的命令行选项_Python 处理脚本的命令行参数(二):使用click
  7. git rebase 丢弃提交
  8. pytorch torch.utils.data.Dataset
  9. MySQL Control Flow Functions(控制流)
  10. TensorFlow tf.keras.layers.Lambda