观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想

故事:

小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。在这样一个简单的故事场景中我们发现了什么?来看看小雪和男孩们的烦恼:
  1.男孩们必须不断的询问小雪的位置变化,从而打断正常的工作; 
  2.小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问,也影响正常的工作。

3.如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式,而且不断的有新的男孩们增加进来,还不知道未来有什么新的回复方式。

看到这么多烦恼,我们创意无限的Nokia公司给小雪和男孩们提出了解决方案:
    Nokia公司荣誉出品了一款带有GPRS功能的手机,该手机保存着一个订阅位置变化短信通知的电话列表,当该手机检测到位置发生变化就会向这个订阅列表里的所有手机发送短信。看到Nokia这个解决方案,男孩们和小雪都应该松一口气,他们各自都可以按照自己正常的生活习惯,只有状态发生变化时候各自才会进行通信。

观察者模式还可以用生活中一个例子来表达,就是从邮局订杂志。假如有一个叫 妮妮 的女孩在A邮局订了《时尚女孩》的杂志,又在B邮局订了《知音》杂志,并且告诉这两家邮局,如果杂志到了就给我打电话我自己来拿,然后邮局就在系统中注册下这个女孩姓名,电话等信息。妮妮剩下的就是等邮局的电话来取杂志了。如果杂志到了,邮局打电话给妮妮说,您的杂志到了,请到某某邮局来取(这相当于程序中把对象的引用——邮局名,传给观察者),如果只说您的杂志到了,请到邮局来取,妮妮怎么知道去哪个邮局拿杂志呀。

下面的程序模仿上面的情形,一个随机数产生对象和两个观察者,这两个观察者都在随机数产生对象那里注册了,意思说如果你产生了新的数字,就通知我一声。

结构图:

类说明

 名称  功能说明
 Observer  表示观察者的接口,要成为观察者必须实现此接口才行
 NumberGenerator  表示产生数值的抽象类
 RandomNumberGenerator  产生随机数的类,继承于NumberGenerator
 NumberObserver  数字观察者,会打印出变化的数字
 SymbolObserver  符号观察者,打印N 个符号,打印多少个符号,由接受到的数值确定

1.Observer

Java代码
  1. package com.pattern.observer;
  2. public interface Observer {
  3. public abstract void update(NumberGenerator generator);
  4. }

2.NumberGenerator

Java代码
  1. package com.pattern.observer;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. /**
  5. * @project JavaPattern
  6. * @author sunnylocus
  7. * @verson 1.0.0
  8. * @date   Aug 27, 2008 1:35:34 PM
  9. * @description 产生数值的抽象类
  10. */
  11. public abstract class NumberGenerator {
  12. private ArrayList observers = new ArrayList();  //存储Observer
  13. /** 添加观察者*/
  14. public void addObserver(Observer observer) {
  15. observers.add(observer);
  16. }
  17. /** 删除观察者*/
  18. public void delObserver(Observer observer) {
  19. observers.remove(observer);
  20. }
  21. /** 通知所有观察者*/
  22. public void notifyObservers() {
  23. Iterator it = observers.iterator();
  24. while(it.hasNext()) {
  25. Observer o =(Observer) it.next();
  26. o.update(this);//this相当于上面提到的邮局名
  27. }
  28. }
  29. public abstract int getNumber();//获取数字
  30. public abstract void generate();//产生数字
  31. }

3.RandomNumberGenerator

Java代码
  1. package com.pattern.observer;
  2. import java.util.Random;
  3. /**
  4. * @project JavaPattern
  5. * @author sunnylocus
  6. * @verson 1.0.0
  7. * @date   Aug 27, 2008 1:48:03 PM
  8. * @description 用于产生随机数及通知观察者的类
  9. */
  10. public class RandomNumberGenerator extends NumberGenerator{
  11. private Random random = new Random();//随机数产生器
  12. private int number;   //用于存放数字
  13. public void generate() {
  14. for(int i=0 ; i < 5; i++) {
  15. number = random.nextInt(10);//产生10以内的随机数
  16. notifyObservers();  //有新产生的数字,通知所有注册的观察者
  17. }
  18. }
  19. /** 获得数字*/
  20. public int getNumber() {
  21. return number;
  22. }
  23. }

4.NumberObserver

Java代码
  1. package com.pattern.observer;
  2. /** 以数字表示观察者的类*/
  3. public class NumberObserver implements Observer{
  4. public void update(NumberGenerator generator) {
  5. System.out.println("NumberObserver:"+ generator.getNumber());
  6. try {
  7. Thread.sleep(1000 * 3); //为了能清楚的看到输出,休眠3秒钟。
  8. }catch(InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }

5.SymbolObserver

Java代码
  1. package com.pattern.observer;
  2. /** 以符号表示观察者的类*/
  3. public class SymbolObserver implements Observer{
  4. public void update(NumberGenerator generator) {
  5. System.out.print("SymbolObserver:");
  6. int count = generator.getNumber();
  7. for(int i = 0 ; i < count; i ++) {
  8. System.out.print("*^_^*  ");
  9. }
  10. System.out.println("");
  11. try {
  12. Thread.sleep(1000 * 3);
  13. }catch(InterruptedException e){
  14. e.printStackTrace();
  15. }
  16. }
  17. }

6.Main(测试类)

Java代码
  1. package com.pattern.observer;
  2. public class Main {
  3. public static void main(String[] args) {
  4. //实例化数字产生对象
  5. NumberGenerator generator = new RandomNumberGenerator();
  6. //实例化观察者
  7. Observer observer1 = new NumberObserver();
  8. Observer observer2 = new SymbolObserver();
  9. //注册观察者
  10. generator.addObserver(observer1);
  11. generator.addObserver(observer2);
  12. generator.generate(); //产生数字
  13. }
  14. }

7.结果输出

设计思想:

观察者模式定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有它的依赖对象将被自动通知并更新

转自:http://sunnylocus.iteye.com/blog/233212

Java 设计模式之观察者模式(Observer pattern)相关推荐

  1. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  2. 锈才学设计模式之 —— 观察者模式(Observer Pattern)

    锈才学设计模式之  -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...

  3. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  4. 设计模式-观察者模式(Observer Pattern)

    设计模式-观察者模式 观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观 ...

  5. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  6. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  7. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  8. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. 设计模式(行为型)之观察者模式(Observer Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  10. 设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现

    文章目录 概念 Code [主题] [观察者s] 观察者一 观察者二 [测试] 源码分析 java.util.Observable 目标类 java.util.Observer 观察者接口 notif ...

最新文章

  1. ewebeditor下利用ckplayer增加html5 (mp4)全平台的支持
  2. HDLBits 系列(9)Gates and Vector
  3. CVPR 2020 《Local-Global Video-Text Interactions for Temporal Grounding》论文笔记
  4. 十年后 AI 是什么样?
  5. iOS MBProgressHUD 之带底板的加载提示
  6. 承博士:让云计算落地生根的中国云计算平台
  7. 关于yii2学习笔记:gii的使用
  8. 理解perl的编码转换——utf8以及乱码
  9. PHPCMS V9 学习总结
  10. WinForm开发之点滴整理
  11. SAP WBS预算可通过二种方式配置和使用
  12. html5模板md风格,使用CSS3 制作一个material-design 风格登录界面实例
  13. 实训项目:PHP双色球效果实现
  14. 怎么自己制作返利机器人教程分享
  15. 《MLB棒球创造营》:走近棒球运动·洛杉矶道奇队
  16. Linux 课程设计 每日小结
  17. 在SQL中创建时间维度表
  18. 一网打尽!所有PMP的计算公式都在这里啦,赶紧学起来,建议收藏
  19. 一个苏州IT人的5年挨踢经历-------面试,薪资,企业,经历全方位揭示(之二)
  20. 安装vim的最新版本

热门文章

  1. 微信会员卡对接CRM后台(java)
  2. 钡铼工业智能物联网关BL110打通智能工厂的任督二脉
  3. Vue Router官网
  4. google 浏览器在手机上为什么不能登录跟电脑同步书签...
  5. spring的redis注解清除指定前缀的数据@CacheEvict
  6. 居民阅读习惯调查分析
  7. phpmyadmin更新php,phpmyadmin 修改记录(不断更新)
  8. 【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标
  9. python—openCV实时追踪乒乓球
  10. java给图片加水印_java如何给图片加水印