Java设计模式 观察者模式 花呗生活号
说到观察者模式,我想大家并不陌生,今天给大家介绍下观察者模式。
首先来看下观察者模式的的定义:定义了对象之间一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。就像支付宝里的花呗生活号一样,当你订阅了花呗生活号,一旦花呗有什么新的功能堆出来,就会把消息推送给你。当然有的消息也可能是根据用户的使用行为进行推送,这里不再考虑。好了,开始我们的观察者模式吧。
先定义一个生活号的接口:
package observerpattern; public interface Subject {/** * 注册一个观察者 * @param observer */ void registerObserver(Observer observer); /** * 移除一个观察者 * @param observer */ void unRegisterObserver(Observer observer); /** * 通知所有的观察者 */ void notifyObservers(); }
接着定义一个观察者的接口:
package observerpattern; public interface Observer {/** * 消息更新 * @param msg */ void update(String msg); }
现在我们创建一个花呗生活号:
/** * 花呗生活号 */ public class AliSubject implements Subject {private List<Observer> mObservers = new ArrayList<Observer>(); private String msg; @Override public void registerObserver(Observer observer) {mObservers.add(observer); }@Override public void unRegisterObserver(Observer observer) {for (int i = 0; i < mObservers.size(); i++) {if (mObservers.contains(observer)) {mObservers.remove(observer); break; }}}@Override public void notifyObservers() {// TODO Auto-generated method stub for (Observer observer : mObservers) {observer.update(msg); }}public void sendMessage(String msg) {this.msg = msg; notifyObservers(); }}
有了生活号,就有了用户。用户有权选择订阅生活号和取消订阅生活号。
花呗用户1:
package observerpattern; public class ObserverUser implements Observer {private Subject subject; public ObserverUser(Subject subject) {super(); this.subject = subject; }/** * 开启花呗服务窗口 */ public void register(){subject.registerObserver(this); }/** * 关闭花呗服务窗口 */ public void remove(){subject.unRegisterObserver(this); System.out.println("用户1取消关注花呗生活号"); }@Override public void update(String msg) {System.out.println(msg); }}
花呗用户2:
package observerpattern; public class ObserverUser2 implements Observer {private Subject subject; public ObserverUser2(Subject subject) {super(); this.subject = subject; }/** * 开启花呗服务窗口 */ public void register(){subject.registerObserver(this); }/** * 关闭花呗服务窗口 */ public void remove(){subject.unRegisterObserver(this); }@Override public void update(String msg) {System.out.println(msg); }}
现在花呗生活有消息更新了:
public class TestSubject {public static void main(String[] args) {AliSubject mSubject = new AliSubject(); ObserverUser mUser = new ObserverUser(mSubject); ObserverUser2 mUser2 = new ObserverUser2(mSubject); mUser.register(); mUser2.register(); mSubject.sendMessage("您的花呗额度更新了..."); }}
控制台输出:
您的花呗额度更新了...
您的花呗额度更新了...
现在用户1,要取消对花呗生活号的关注:
public class TestFactory {public static void main(String[] args) {AliSubject mSubject = new AliSubject(); ObserverUser mUser = new ObserverUser(mSubject); ObserverUser2 mUser2 = new ObserverUser2(mSubject); mUser.register(); mUser2.register(); mSubject.sendMessage("您的花呗额度更新了..."); mUser.remove(); mSubject.sendMessage("您的花呗额度更新了..."); }}
控制台输出:
您的花呗额度更新了...
您的花呗额度更新了...
用户1取消关注花呗生活号
您的花呗额度更新了...
我们可以看到用户1,取消了关注,当花呗生活号再次推送消息的时候,用户1已经不再接收消息。其实观察者模式,还是很常见的,像我们安卓中的广播,就是一个很好的列子。有兴趣的同学可以抽出点时间来,好好去看下广播的实现方式。好了,到这里恭喜你已经学会了观察者模式。感谢路过。
Java设计模式 观察者模式 花呗生活号相关推荐
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解
Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...
- java设计模式 观察者模式_理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- Java设计模式——观察者模式
转自:http://www.cnblogs.com/shamgod/p/4588557.html 一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法 ...
- Java设计模式—观察者模式(Observer pattern)
故事: 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出.男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追 ...
- java设计模式-观察者模式
观察者模式介绍: 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提 ...
- Java设计模式——观察者模式与Spring事件监听器
写在前面的话:终于通读了一遍<Spring源码深度解析>,在Spring的消息发布(Message)模块使用了设计模式中的观察者模式的经典实现,所以趁此机会总结一些. 1. 业务场景 Sp ...
最新文章
- 【LC3开源峰会网络技术系列之三】基于JStorm的网络分析平台
- java返回值变为文件_Java 文件操作-File
- NOI 2015 品酒大会
- TCRP风控管理师知识点:信贷评分卡模型授信
- [Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses
- Flickr30k图像标注数据集下载及使用方法(转载的,备忘)
- 消费消息删除_【进阶之路】可靠消息最终一致性解决方案
- 使用C++对TINY+语言进行词法分析、语法分析、语义分析和中间代码生成
- suse 安装php5.4_SUSE LINUX 安装Apache2 + PHP5 (普通安装,不是yum)
- IOS 微信支付流程详解
- nextcloud+nginx+mysql_nextcloud网盘搭建:Ubuntu18.04+Nginx+Mysql
- vue 左侧菜单隐藏_vue.js 左侧二级菜单显示与隐藏切换的实例代码?
- 一文带你实现RPC框架
- 学生学籍管理系统页面源代码html_学生信息管理系统系统源代码
- Maxon Motor参数查询方法
- 边框给背景图css怎么写,使用css设置边框背景图片
- 2017美团校招安卓岗
- pycharm+python3.6安装pywifi
- Java 性能调优 (JVM CPU IO Memery)
- 中南大学2015年研究生复试淘汰率将超40%
热门文章
- 【学习笔记】Hive
- Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义
- 关于error: #20: identifier “XXXX“ is undefined缺失.h文件的问题
- 搭建自己的健康上报APP全栈开发教学
- 索尼android 8,索尼立功!让Android 8.0有了一个黑科技
- Python3 list 排序函数详解
- tableau画时序图
- 2022/07/17、18 day10/11:Stream流、方法引用
- mamp开启php错误提示,PHP-为什么MAMP不显示错误?
- 史上最详细python学习路线-从入门到精通,只需5个月时间