观察者模式

其实就是一个发布者和订阅者之间的关系

如果订阅者订阅了发布者,那么发布者发布一条消息,订阅者就会立马知道。

中间的关系也就是订阅者需要去订阅消息(也就是,发布者的通知资源池子(也就是存储订阅者的对象集合)里面存在的,当发布者发布对应消息的时候,发布者就会立即调用订阅者里面的集合里面的所有加入到订阅池子的订阅者)

一个简单的观察者模式的示例

Subject(发布者)

package com.example.demo.observe.subject;import com.example.demo.observe.core.EventListener;public class Subject extends EventListener {//通常的话,采用动态代理来实现监控,避免了代码入侵。public void add(){System.out.println("调用添加的方法");trigger(SubjectEventType.ON_ADD);}public void remove(){System.out.println("调用删除方法");trigger(SubjectEventType.ON_REMOVE);}
}

Observe(观察者)

package com.example.demo.observe.subject;import com.example.demo.observe.core.Event;public class Observe  {public void advice(Event e){System.out.println("=====触发事件,打印日志=======");System.out.println(e);}
}

事件类(记录了发布者,订阅者,时间,以及需要通知的方法)

package com.example.demo.observe.core;import java.lang.reflect.Method;public class Event {//事件源private Object source;//通知目标private Object target;//回调private Method callable;//触发private String trigger;//事件private Long time;public Event setTrigger(String trigger) {this.trigger = trigger;return this;}public Event(Object target, Method callable) {this.target = target;this.callable = callable;}public Object getSource() {return source;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Method getCallable() {return callable;}public void setCallable(Method callable) {this.callable = callable;}public String getTrigger() {return trigger;}public Long getTime() {return time;}public void setTime(Long time) {this.time = time;}public void setSource(Object source) {this.source = source;}@Overridepublic String toString() {return "Event{\n" +"\tsource=" + source + ",\n" +"\tttarget=" + target + ",\n" +"\tcallable=" + callable + ",\n" +"\ttrigger='" + trigger + '\'' + ",\n" +'}';}
}

订阅池(也就是记录所有订阅者信息,及操作订阅者的类)

package com.example.demo.observe.core;import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class EventListener {protected Map<Enum, Event> events = new HashMap<>();public void addListener(Enum eventType, Object target, Method callback ){//注册事件,用反射调用events.put(eventType, new Event(target, callback));}protected void trigger(Enum call) {if (!this.events.containsKey(call)) {return;}trigger(this.events.get(call).setTrigger(call.toString()));}private void trigger(Event e){e.setSource(this);e.setTime(System.currentTimeMillis());try {Object invoke = e.getCallable().invoke(e.getTarget(), e);} catch (Exception ex) {ex.printStackTrace();}}
}

订阅分类(对应发布者的操作分类)

package com.example.demo.observe.subject;public enum  SubjectEventType {ON_ADD,ON_REMOVE,ON_EDIT,ON_QUERY;
}

测试类

package com.example.demo.observe.subject;import com.example.demo.observe.core.Event;import java.lang.reflect.Method;public class ObserverTest {public static void main(String[] args) {try {//观察者Observe observe = new Observe();Method advice = observe.getClass().getMethod("advice", new Class<?>[]{Event.class});Subject subject = new Subject();subject.addListener(SubjectEventType.ON_ADD, observe, advice);subject.addListener(SubjectEventType.ON_REMOVE, observe, advice);subject.remove();subject.add();}catch (Exception e){e.printStackTrace();}}
}

JAVA设计模式-观察者模式(Observe)相关推荐

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  3. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  4. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

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

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

  6. Java设计模式——观察者模式

    转自:http://www.cnblogs.com/shamgod/p/4588557.html 一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法 ...

  7. java设计模式-观察者模式

    观察者模式介绍: 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提 ...

  8. Java设计模式——观察者模式与Spring事件监听器

    写在前面的话:终于通读了一遍<Spring源码深度解析>,在Spring的消息发布(Message)模块使用了设计模式中的观察者模式的经典实现,所以趁此机会总结一些. 1. 业务场景 Sp ...

  9. java设计模式---观察者模式

    观察者模式 Observer 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己. 观察者模式 ...

最新文章

  1. Jquery实现的Tabs页签
  2. 现代软件工程 第十章 【典型用户和场景】 练习与讨论
  3. 教你用OpenCV实现机器学习最简单的k-NN算法
  4. php 输出 cvs,php将数组转换成cvs格式并输出的简单示例
  5. 【数据结构与算法】之深入解析“路径交叉”的求解思路与算法示例
  6. python人脸识别门禁_用Python做人脸识别
  7. STM32——直流电机PI调速
  8. Android 系统(78)--应用安装时间长
  9. visual studio 2017 连接 SQL Server
  10. java后台代码添加超链接_Java 添加超链接至Excel文档
  11. java的queue类,java集合类深入分析之Queue篇
  12. 【数据结构和算法笔记】:广义表
  13. USB 2.0 Spec 微缩版
  14. LMDB:闪电内存映射数据库管理器
  15. php中求10递归算法,PHP递归算法的应用(含示例)
  16. 毕业5年决定你的命运 --------值得所有不甘平庸的人看看
  17. 微信昵称特殊符号入库报错解决方案
  18. python bytes转str_Python3中bytes类型转换为str类型
  19. asd f sdfsd f afsda fsdasC ASDF
  20. RocketMQ 优雅停机技巧

热门文章

  1. Pandas 文本数据方法 contains()
  2. linux对某个文件进行操作步骤,实验二 Linux系统简单文件操作命令
  3. three.js和php,详解three.js本地运行的方法
  4. 4安全框_压花玻璃与安全玻璃有哪些特点?玻璃隔断的介绍
  5. python color属性_模块“cv2.cv2”没有“COLOR”属性“BGR2GREY”
  6. php 返回索引,PHP mySQL - 你能否返回帶有數字索引的關聯數組?
  7. Windows Server 2016如何配置定期执行任务计划
  8. 负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法
  9. 支持的vCenter Server High Availability选项(2096800)
  10. Go 语言学习总结(5)—— Go 学习笔记总结