观察者模式-百度摇号短信提醒举例说明
观察者模式定义了一对多的依赖,当被观察者发生改变时,依赖于它的所有观察者会收到通知并自动更新,下面我们以百度摇号短信提醒举例说明,相信大家都有切身体会吧,下面看图:
如图所示,短信提醒系统就是被观察者,每个摇号者都是观察者。观察者需要向被观察者订阅,才能收到被观察者发出的通知,同时观察者也可以取消订阅。
观察者模式包括两个接口、两个实现类,如下图:
Observable接口(短信提醒系统)可以添加观察者、注销观察者、通知所有的观察者,它有许多个观察者(摇号者) 。当收到Observable的通知时,具体的观察者会更新自己的状态,比如得知中签后,有的人会买车上号牌、有的人会把号牌出租。
下面我们写代码说明,首先是被观察者接口、观察者接口。
public interface Observable {/*** 注册一个观察者** @param observer*/public void registerObserver(Observer observer);/*** 移除一个观察者** @param observer*/public void unRegisterObserver(Observer observer);/*** 通知所有的观察者** @param WinningNumbers WinningNumbers 是摇中的编号*/public void notifyObservers(String WinningNumbers);
}
public interface Observer {/*** 得知中签后该做什么*/public void doWhatAfterWon();
}
下面是摇号短信提醒实现类。
public class YaohaoSMSReminder implements Observable {private List<Observer> observers = new ArrayList<Observer>();//中签编号private String mWinningNumbers;@Overridepublic void registerObserver(Observer observer) {if (observer != null) {observers.add(observer);}}@Overridepublic void unRegisterObserver(Observer observer) {if (observer != null) {observers.remove(observer);}}@Overridepublic void notifyObservers(String WinningNumbers) {if (observers != null) {for (Observer observer : observers) {observer.doWhatAfterWon(WinningNumbers);}}}public void setWinningNumbers(String winningNumbers) {mWinningNumbers = winningNumbers;}
}
下面模拟两个摇号者。
package designPattern;import android.util.Log;/*** Created by liuliu on 2017/6/9.*/public class Yaohao1 implements Observer {private static final String myYaohaoNumbers = "1234567890";private Observable mYaohaoSMSReminder;public Yaohao1(Observable observable) {mYaohaoSMSReminder = observable;mYaohaoSMSReminder.registerObserver(this);}@Overridepublic void doWhatAfterWon(String WinningNumbers) {if (myYaohaoNumbers.equals(WinningNumbers)) {Log.i("Yaohao1 中签了", "买车上号牌");} else {Log.i("Yaohao1 未中签,本期中签编号:", WinningNumbers);}}
}
package designPattern;import android.util.Log;/*** Created by liuliu on 2017/6/9.*/public class Yaohao2 implements Observer {private static final String myYaohaoNumbers = "1234567891";private Observable mYaohaoSMSReminder;public Yaohao2(Observable observable) {mYaohaoSMSReminder = observable;mYaohaoSMSReminder.registerObserver(this);}@Overridepublic void doWhatAfterWon(String WinningNumbers) {if (myYaohaoNumbers.equals(WinningNumbers)) {Log.i("Yaohao2 中签了", "把号牌租出去");} else {Log.i("Yaohao2 未中签,本期中签编号:", WinningNumbers);}}
}
下面是测试代码。
package designPattern;/*** Created by liuliu on 2017/6/9.*/public class TestObserverAndObservable {public static void main(String[] args) {YaohaoSMSReminder smsReminder = new YaohaoSMSReminder();Yaohao1 yaohao1 = new Yaohao1(smsReminder);Yaohao2 yaohao2 = new Yaohao2(smsReminder);smsReminder.setWinningNumbers("1234567890");smsReminder.notifyObservers("1234567890");}
}
测试结果:
Yaohao1 中签了,买车上号牌
Yaohao2 未中签,本期中签编号:1234567890
此外,Java SDK中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer,下面我们使用Java内置Observable、Observer进行测试。
被观察者(摇号短信提醒系统):
package com.example;import java.util.Observable;/*** Created by liuliu on 2017/6/9.*/public class YaohaoSmsReminder extends Observable {private String mWinningNumbers;public void setWinningNumbers(String winningNumbers) {mWinningNumbers = winningNumbers;setChanged();notifyObservers();}public String getWinningNumbers() {return mWinningNumbers;}}
观察者1、2:
package com.example;import java.util.Observable;
import java.util.Observer;/*** Created by liuliu on 2017/6/9.*/public class Yaohao1 implements Observer {private static final String myYaohaoNumbers = "1234567890";@Overridepublic void update(Observable observable, Object o) {YaohaoSmsReminder reminder = (YaohaoSmsReminder) observable;String numbers = reminder.getWinningNumbers();if (myYaohaoNumbers.equals(numbers)) {System.out.println("Yaohao1中签了");} else {System.out.println("Yaohao1未中签");}}
}
package com.example;import java.util.Observable;
import java.util.Observer;/*** Created by liuliu on 2017/6/9.*/public class YaoHao2 implements Observer{private static final String myYaohaoNumbers = "1234567891";public void update(Observable observable, Object o) {YaohaoSmsReminder reminder = (YaohaoSmsReminder) observable;String numbers = reminder.getWinningNumbers();if (myYaohaoNumbers.equals(numbers)) {System.out.println("Yaohao2中签了");} else {System.out.println("Yaohao2未中签");}}
}
测试类:
package com.example;public class MyClass {public static void main(String[] args) {YaohaoSmsReminder reminder = new YaohaoSmsReminder();Yaohao1 yaohao1 = new Yaohao1();YaoHao2 yaoHao2 = new YaoHao2();reminder.addObserver(yaohao1);reminder.addObserver(yaoHao2);reminder.setWinningNumbers("1234567890");}
}
测试结果:
Yaohao2未中签
Yaohao1中签了
使用Java内置的类实现观察者模式,代码非常简洁,对于addObserver,removeObserver,notifyObservers都已经为我们实现了。
希望大家批评指正,Android开发交流群:576500546
观察者模式-百度摇号短信提醒举例说明相关推荐
- 华为手机备忘录怎样设置每个月12号短信提醒要做的事
华为手机上可以使用备忘录来记事和提醒,一些功能强大且好用的备忘录工具,比如云便签,不仅能设置定时提醒,还可开启每月指定时间自动重复提醒及短信同步提醒备忘录事项,以短信的形式在每月发送备忘录提醒通知信息 ...
- linux 程序返回值 139,Linux系统监控之ssh登陆自动139邮件短信提醒
linux系统监控之ssh登陆自动139邮件短信提醒 Linux系统监控非常重要,互联网的网络的安全是一个非常重要的问题,很多时候,我们会出于安全考虑,希望服务器在有用户通过ssh登陆时能自动向管理员 ...
- 通过QQ邮件短信提醒
通过这个QQ邮箱这个机制,可以免费给自己发短信提醒了. ------------------------------------------------------------------------ ...
- 如何设置好看的form表单样式_Qamp;A| 表单如何设置短信提醒
Hi,大家好,表姐又来给大家答疑解惑啦!这一期的Q&A答疑我们来聊聊表单该如何设置短信提醒. 表单的短信提醒功能非常有用,通过手机短信及时反馈信息,让你实时掌握数据最新动态,不仅可以设置给表单 ...
- 门诊预约成功短信提醒,几毛钱的花费,究竟有无必要?
用户线上预约挂号成功后,可接收预约成功的短信提醒,短信内容可包含: 1.门诊名称 2.预约信息 3.注意事项 4.联系电话 5.门诊地址 示例:[XXXXX医院]您好!您已成功预约xx月xx日上午xx ...
- SMS短信解码举例(一)
SMS短信解码举例 0891683108200505F0040D91683105155694F5000850208151754500044F60597D <1>短信中心地址字段 08916 ...
- 华为设置android系统提醒功能,华为手机短信不提醒怎么办?华为手机短信提醒设置方法...
华为手机短信提醒设置方法 1)检查当前设置的默认短信应用是哪个应用. ①点击桌面"设置"图标②找到"应用程序管理" ③选择"默认应用设置"④ ...
- 关闭阿里云的短信提醒
阿里云方便是方便,但是有太多的短信骚扰,所以可以考虑关闭一些阿里云的短信提醒 找到消息中心
- 电脑桌面云便签怎么设置短信提醒便签事项?
电脑桌面云便签Windows版支持设置待办提醒事项,提醒事项到期后不仅可以在软件内接收提醒消息,还可以开启手机短信提醒. 一.打开已登录的电脑桌面云便签Windows版,点击上方用户头像,或者按下默认 ...
- 应用程序加入短信提醒功能实现全步骤
应用程序加入短信提醒功能实现全步骤 短信猫提供商的安装光盘下载 在很多应用程序中,特别是企业级 web 应用程序中,有很多时候需要及时提醒用户某些信息.等待用户登录系统后弹出提醒信息, ...
最新文章
- kmeans及模型评估指标_模型评估常用指标
- C# 动态获取、修改、更新配置文件 实现思路
- hdu 2648 Shopping
- JS数组的需要注意的问题
- linux之lsof使用技巧
- 高品味男人:分寸与克制
- DP之石子堆合并问题
- Image-Guided Navigation of a Robotic Ultrasound Probe for Autonomous Spinal Sonography Using a
- 高纯度钨酸铜粉末/钨酸铁粉末/钨酸亚铁粉末/硫化铋粉末/铬酸铋粉末/氧化锆粉末/铬酸钡粉末
- Scroller的使用及解析(滑动删除)
- 学习QT之调色板(QPalette)
- python openpyxl删除excel特定行数据遇到的问题
- Push to origin/master was rejected异常解决办法
- 2018年07月17日(1~10)
- 华科计算机硕士毕业论文,华科硕士论文格式
- CSS3新增了哪些新特性
- 关于JS的编码转换问题
- nvidia显卡的Exclusive Process模式
- 网络原理(2)——网络开发
- heritrix mysql_Heritrix使用小结
热门文章
- Qt5 QFileDialog中文英文交界处乱码问题
- SNF快速开发平台--规则引擎在程序当中如何调用
- 搜狗输入法原先能在word中输入中文,现在不行。
- 排查oracle数据库服务是否启动
- SqlServer中的Top * With Ties
- 揭秘你所看不见的技术原理 - 广告推荐系统
- mysql 按照经验排名_根据以往经验整理的典型性能bug
- layui数据表格合并列
- Day 4.Social Data Sentiment Analysis: Detection of Adolescent Depression Signals
- 基于Proteus学习单片机系列(五)——定时器实现电子表