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

1. 业务场景

Spring框架中的就是使用了观察者模式实现事件的消息发布(Message)模块的。

2. 传统处理/观察者模式

2.1 什么是观察者模式

这一次讲的情节很简单,但是充满了谋略和斗争。大体的意思就是三国初期,曹刘孙三家在徐州联手消灭了吕布,但是自己也伤了元气。而在此时袁术得了传国玉玺,在淮南称帝,兵精将广,图谋不轨,对三家威胁很大。于是曹刘孙三家在一起开会,决定派遣一名超级间谍打入袁术身旁,监视他的一举一动,这样的话一旦袁术想干什么坏事,他们就可以知道并做出相应调整,知己知彼百战百胜。

计是好计,问题时派谁去当这个超级间谍呢?正当大家愁眉苦脸的时候,美女貂蝉自告奋勇,想当年董卓那么厉害都让灭了,何况一个小小的袁术?大家一听有道理,于是就把貂蝉献给了元素当了妃子。另外三家还各自派出了小奸细常住在淮南城内,他们的任务就是当联络员,貂蝉有什么情报总不能自己曹刘孙三家挨个跑着送吧?直接丢给各国联络员,然后让他们通知各自的主公就OK了,而三家只要一接到各自奸细的通知,就会立即做出反应。

还有一个小插曲,袁术虽然手下了貂蝉,但是对她看管很严,大大方法的把情报送出去不可能,逼不得已,貂蝉设计了一套密码来传送情报,虽然密码方法没有公开,但是她想总有人可以破解吧,没错,对诸葛亮来说就是小菜一碟,从此袁术穿什么内裤曹刘孙三家都知道的清清楚楚。

用观察者模式来分析下上面的故事

  1. 美女貂蝉:貂蝉在观察者模式中叫做被观察者(Subject),主要任务是独立的管理后台数据和业务逻辑,同时尽可能不影响前台可会断界面变化的影响。当然,还要负责登记或者住校各个观察者。在这个故事里,貂蝉仅仅维护了一个数据,就是情报——私有变量info;另外还有一个业务逻辑,是用来加密info的方法Reverse(String str) 。每次得到新的情报,她就会先加密,然后找到在自己这登记过的联络员,让这些联络员联系自己的主公应变。情报一旦发出去,貂蝉的任务就算完成了,具体曹刘孙三家怎么应对,是打是降还是另有办法,那是三家自己的事情,和貂蝉没有什么关系了。
  2. 曹孙刘三家:曹孙刘三家在观察者模式中叫做观察者,主要任务就是从界面上用各种方式即时反映出被观察者,所谓“各种方式”就是说字符、图形、声音都可以表示同样的数据,只是外在表示不同而已,本质都是一些数据,所谓“即时”,就是说只要被观察者发生变化,观察者也会立即跟着变化,用行话叫做刷新Update吧,在这个故事里,我们可以看到运行结果中,每次貂蝉有什么新的情报,三家都会在屏幕上显示出来,虽然简单,但是他们确实是用各自不同的方式表示了同样的数据。

观察者模式又称为发布/订阅模式,在对象之间定义了一对多的依赖关系,这样依赖,当一个对象,依赖它的对象会收到通知并自动更新。

3. 代码实现

3.1 创建被观察者
public interface Subject<T> {/*** 订阅者列表*/List<Observer> list = new ArrayList<Observer>();/*** 注册订阅者** @param obs*/void registerObserver(T obs);/*** 移除订阅者** @param obs*/void removeObserver(T obs);/*** 通知所有的观察者更新状态*/void notifyAllObservers();}
3.2 创建被观察者实现
public class CurrentSubject implements Subject<Observer> {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;// 被观察者值发生变化,请通知所有观察者this.notifyAllObservers();}/*** 注册订阅者** @param obs*/@Overridepublic void registerObserver(Observer obs) {list.add(obs);}/*** 移除订阅者** @param obs*/@Overridepublic void removeObserver(Observer obs) {list.remove(obs);}/*** 通知所有的观察者更新状态*/@Overridepublic void notifyAllObservers() {for (Observer observer : list) {// 更新每个观察者信息observer.update(this);}}
}
3.3 创建观察者
public interface Observer {/*** 修改方法*/void update(Subject subject);
}
3.4 创建观察者实现
public class ObserverA implements Observer {/*** myState需要跟目标对象的state值保持一致!*/private int myState;/*** 修改方法* 更新为和目标对象的值一致* @param subject*/@Overridepublic void update(Subject subject) {myState = ((CurrentSubject) subject).getState();}public int getMyState() {return myState;}public void setMyState(int myState) {this.myState = myState;}
3.5 测试方法
public class Test {public static void main(String[] args) {CurrentSubject currentSubject = new CurrentSubject();// 创建多个观察者ObserverA a = new ObserverA();ObserverA b = new ObserverA();ObserverA c = new ObserverA();// 将这三个观察者添加到subject对象的列表中currentSubject.registerObserver(a);currentSubject.registerObserver(b);currentSubject.registerObserver(c);// 改变subject的状态currentSubject.setState(3000);System.out.println("================第一次=================");System.out.println(a.getMyState());System.out.println(b.getMyState());System.out.println(c.getMyState());// 改变subject的状态currentSubject.setState(30);System.out.println("================第二次=================");System.out.println(a.getMyState());System.out.println(b.getMyState());System.out.println(c.getMyState());// 改变subject的状态currentSubject.setState(99);System.out.println("================第三次=================");System.out.println(a.getMyState());System.out.println(b.getMyState());System.out.println(c.getMyState());}
}

4. 观察者模式用途与优势

优点:解除观察者与被观察者之间的耦合。让耦合的双方都依赖抽象,而不是依赖具体。从而使得给子变化都不会影响另一边的变化。易于扩展,对于同一被观察者新增观察者无需修改原有代码。

缺点:依赖关系并未完全解除,抽象的被观察者仍然依赖观察者。使用观察者模式时需要开率开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般采用异步实现。可能会引起多余的数据通知。

用途:1. Spring框架的Message消息广播功能;
2. Servlet中监听器的实现;
3. JDK中内置了观察者模式经典实现;
4. 聊天室程序的,服务器转发给所有客户端。

5. 问题与解决方法

Java设计模式——观察者模式与Spring事件监听器相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【spring】Spring事件监听器ApplicationListener的使用与源码分析

    ApplicationEvent以及Listener是Spring为我们提供的一个事件监听.订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性. ...

  8. JAVA设计模式-观察者模式(Observe)

    观察者模式 其实就是一个发布者和订阅者之间的关系 如果订阅者订阅了发布者,那么发布者发布一条消息,订阅者就会立马知道. 中间的关系也就是订阅者需要去订阅消息(也就是,发布者的通知资源池子(也就是存储订 ...

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

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

最新文章

  1. unix网络编程之简介
  2. hibernate增删改查的标准范例
  3. MySQL 事务隔离
  4. 机器学习与统计学的本质差异
  5. 数据eda_银行数据EDA:逐步
  6. thinkphp内置标签简单讲解
  7. 红色风格电脑手机数码商城系统网站源码
  8. linux 导出io,Linux基础知识之IO重定向
  9. 编译ffmpeg:libavdevice/xcbgrab.c:28:10: fatal error: xcb/xfixes.h: 没有那个文件或目录
  10. 小米账号无故泄露 手机安全问题何解?
  11. 关于数据安全中一些概念的学习——容灾备份
  12. 程序开发类本科论文结构【2022年修改】
  13. 去掉android点击事件产生的半透明蓝色背景
  14. 隧道联系测量高程传递水准数据处理流程及说明
  15. app对于接口返回数据的容错测试(健壮性测试)
  16. CMakeList.txt的简单使用
  17. RIS前言技术讲座系列
  18. crmeb阿里云短信配置
  19. 晶体三极管工作原理讲解方法探讨
  20. 【小狐狸 - 横版游戏开发】1.编辑素材 Til

热门文章

  1. 项目实战-美少女养成记
  2. VCL中一些面向对象程序语言的设计手法
  3. 全局监听空格键事件 踩坑
  4. 初识OpenGL (-)VAO顶点数组对象
  5. base64图片 类型
  6. 年薪百万的程序员,上网都在看什么?
  7. 2021年广西省安全员B证最新解析及广西省安全员B证新版试题
  8. Linux 网络工具——nc命令
  9. 2021年中国干法啤酒花系统市场趋势报告、技术动态创新及2027年市场预测
  10. android o android8.0 startforegroundservice startforegroundservice() did not then call service.star