观察者模式定义了一对多的依赖,当被观察者发生改变时,依赖于它的所有观察者会收到通知并自动更新,下面我们以百度摇号短信提醒举例说明,相信大家都有切身体会吧,下面看图:

如图所示,短信提醒系统就是被观察者,每个摇号者都是观察者。观察者需要向被观察者订阅,才能收到被观察者发出的通知,同时观察者也可以取消订阅。

观察者模式包括两个接口、两个实现类,如下图:

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

观察者模式-百度摇号短信提醒举例说明相关推荐

  1. 华为手机备忘录怎样设置每个月12号短信提醒要做的事

    华为手机上可以使用备忘录来记事和提醒,一些功能强大且好用的备忘录工具,比如云便签,不仅能设置定时提醒,还可开启每月指定时间自动重复提醒及短信同步提醒备忘录事项,以短信的形式在每月发送备忘录提醒通知信息 ...

  2. linux 程序返回值 139,Linux系统监控之ssh登陆自动139邮件短信提醒

    linux系统监控之ssh登陆自动139邮件短信提醒 Linux系统监控非常重要,互联网的网络的安全是一个非常重要的问题,很多时候,我们会出于安全考虑,希望服务器在有用户通过ssh登陆时能自动向管理员 ...

  3. 通过QQ邮件短信提醒

    通过这个QQ邮箱这个机制,可以免费给自己发短信提醒了. ------------------------------------------------------------------------ ...

  4. 如何设置好看的form表单样式_Qamp;A| 表单如何设置短信提醒

    Hi,大家好,表姐又来给大家答疑解惑啦!这一期的Q&A答疑我们来聊聊表单该如何设置短信提醒. 表单的短信提醒功能非常有用,通过手机短信及时反馈信息,让你实时掌握数据最新动态,不仅可以设置给表单 ...

  5. 门诊预约成功短信提醒,几毛钱的花费,究竟有无必要?

    用户线上预约挂号成功后,可接收预约成功的短信提醒,短信内容可包含: 1.门诊名称 2.预约信息 3.注意事项 4.联系电话 5.门诊地址 示例:[XXXXX医院]您好!您已成功预约xx月xx日上午xx ...

  6. SMS短信解码举例(一)

    SMS短信解码举例 0891683108200505F0040D91683105155694F5000850208151754500044F60597D <1>短信中心地址字段 08916 ...

  7. 华为设置android系统提醒功能,华为手机短信不提醒怎么办?华为手机短信提醒设置方法...

    华为手机短信提醒设置方法 1)检查当前设置的默认短信应用是哪个应用. ①点击桌面"设置"图标②找到"应用程序管理" ③选择"默认应用设置"④ ...

  8. 关闭阿里云的短信提醒

    阿里云方便是方便,但是有太多的短信骚扰,所以可以考虑关闭一些阿里云的短信提醒 找到消息中心

  9. 电脑桌面云便签怎么设置短信提醒便签事项?

    电脑桌面云便签Windows版支持设置待办提醒事项,提醒事项到期后不仅可以在软件内接收提醒消息,还可以开启手机短信提醒. 一.打开已登录的电脑桌面云便签Windows版,点击上方用户头像,或者按下默认 ...

  10. 应用程序加入短信提醒功能实现全步骤

    应用程序加入短信提醒功能实现全步骤 短信猫提供商的安装光盘下载         在很多应用程序中,特别是企业级 web 应用程序中,有很多时候需要及时提醒用户某些信息.等待用户登录系统后弹出提醒信息, ...

最新文章

  1. kmeans及模型评估指标_模型评估常用指标
  2. C# 动态获取、修改、更新配置文件 实现思路
  3. hdu 2648 Shopping
  4. JS数组的需要注意的问题
  5. linux之lsof使用技巧
  6. 高品味男人:分寸与克制
  7. DP之石子堆合并问题
  8. Image-Guided Navigation of a Robotic Ultrasound Probe for Autonomous Spinal Sonography Using a
  9. 高纯度钨酸铜粉末/钨酸铁粉末/钨酸亚铁粉末/硫化铋粉末/铬酸铋粉末/氧化锆粉末/铬酸钡粉末
  10. Scroller的使用及解析(滑动删除)
  11. 学习QT之调色板(QPalette)
  12. python openpyxl删除excel特定行数据遇到的问题
  13. Push to origin/master was rejected异常解决办法
  14. 2018年07月17日(1~10)
  15. 华科计算机硕士毕业论文,华科硕士论文格式
  16. CSS3新增了哪些新特性
  17. 关于JS的编码转换问题
  18. nvidia显卡的Exclusive Process模式
  19. 网络原理(2)——网络开发
  20. heritrix mysql_Heritrix使用小结

热门文章

  1. Qt5 QFileDialog中文英文交界处乱码问题
  2. SNF快速开发平台--规则引擎在程序当中如何调用
  3. 搜狗输入法原先能在word中输入中文,现在不行。
  4. 排查oracle数据库服务是否启动
  5. SqlServer中的Top * With Ties
  6. 揭秘你所看不见的技术原理 - 广告推荐系统
  7. mysql 按照经验排名_根据以往经验整理的典型性能bug
  8. layui数据表格合并列
  9. Day 4.Social Data Sentiment Analysis: Detection of Adolescent Depression Signals
  10. 基于Proteus学习单片机系列(五)——定时器实现电子表