故事:

小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出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. }
package com.pattern.observer;public interface Observer {   public abstract void update(NumberGenerator generator);}

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. }
package com.pattern.observer;import java.util.ArrayList;import java.util.Iterator;/** * @project JavaPattern * @author sunnylocus     * @verson 1.0.0 * @date   Aug 27, 2008 1:35:34 PM * @description 产生数值的抽象类 */public abstract class NumberGenerator { private ArrayList observers = new ArrayList();  //存储Observer   /** 添加观察者*/ public void addObserver(Observer observer) {        observers.add(observer);    }   /** 删除观察者*/ public void delObserver(Observer observer) {        observers.remove(observer); }   /** 通知所有观察者*/   public void notifyObservers() {     Iterator it = observers.iterator();        while(it.hasNext()) {           Observer o =(Observer) it.next();          o.update(this);//this相当于上面提到的邮局名        }   }   public abstract int getNumber();//获取数字  public abstract void generate();//产生数字}

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. }
package com.pattern.observer;import java.util.Random;/** * @project JavaPattern * @author sunnylocus  * @verson 1.0.0 * @date   Aug 27, 2008 1:48:03 PM * @description 用于产生随机数及通知观察者的类 */public class RandomNumberGenerator extends NumberGenerator{  private Random random = new Random();//随机数产生器  private int number;   //用于存放数字  public void generate() {        for(int i=0 ; i < 5; i++) {           number = random.nextInt(10);//产生10以内的随机数           notifyObservers();  //有新产生的数字,通知所有注册的观察者     }   }    /** 获得数字*/ public int getNumber() {        return number;  }   }

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. }
package com.pattern.observer;/** 以数字表示观察者的类*/public class NumberObserver implements Observer{  public void update(NumberGenerator generator) {     System.out.println("NumberObserver:"+ generator.getNumber());        try {           Thread.sleep(1000 * 3); //为了能清楚的看到输出,休眠3秒钟。      }catch(InterruptedException e) {            e.printStackTrace();        }   }   }

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. }
package com.pattern.observer;/** 以符号表示观察者的类*/public class SymbolObserver implements Observer{  public void update(NumberGenerator generator) {     System.out.print("SymbolObserver:");      int count = generator.getNumber();             for(int i = 0 ; i < count; i ++) {            System.out.print("*^_^*  ");      }       System.out.println("");       try {           Thread.sleep(1000 * 3);     }catch(InterruptedException e){         e.printStackTrace();        }   }}

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. }
package com.pattern.observer;public class Main {   public static void main(String[] args) {        //实例化数字产生对象     NumberGenerator generator = new RandomNumberGenerator();       //实例化观察者        Observer observer1 = new NumberObserver();     Observer observer2 = new SymbolObserver();     //注册观察者     generator.addObserver(observer1);       generator.addObserver(observer2);               generator.generate(); //产生数字    }}

7.结果输出

设计思想:

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

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

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

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

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

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

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

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

  4. Android常见设计模式——观察者模式 (Observer Pattern)

    文章目录 1. 前言 2. 观察者模式 2.1 源码 2.2 结构 3. Android中的观察者模式 1. 前言 观察者模式是在代码框架中使用比较高的一个设计模式,常常又叫做订阅/发布模式.而通过这 ...

  5. 设计模式-观察者模式(Observer)-Java

    设计模式-观察者模式(Observer)-Java 目录 文章目录 1.前言 2.示例案例-多人联机对战游戏的设计 3.观察者模式概述 3.1.观察者模式定义 3.2.观察者模式结构 3.3.观察者模 ...

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

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

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

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

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

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

  9. 我理解设计模式C++实现观察者模式Observer Pattern

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

最新文章

  1. 一个class运用promise的延时调用
  2. 期望最大化(EM)算法
  3. C语言编译:CMakeLists.txt语句【01】
  4. jQuery的事件方法
  5. 自媒体敏感词大全_2020年自媒体软件大全,这里真的有大宝贝……
  6. java 匿名委托_委托,匿名方法,λ 表达式
  7. 数据库(基础SQL)
  8. linux小红伞安装黑屏,在linux下安装Avria(小红伞)
  9. 【win10专业版】ultraiso如何制作光盘启动盘
  10. 关于JeeSite框架Shiro序列化漏洞修复解决方法
  11. UE编辑器修改背景theme
  12. tomato(番茄)固件的简单设置截图
  13. 车联网行业报告及摘要
  14. 一文讲懂蓝绿发布和金丝雀发布
  15. 《很杂很杂的杂学知识》 学习笔记
  16. python怎么保留整数输出_python怎么保留整数
  17. win10突然复制粘贴用不了了
  18. 应届生如何做好一份简历?
  19. 天兔(Lepus)监控系统快速安装部署
  20. 创意电子学-小知识:晶体管

热门文章

  1. 创建centos7下的加密移动硬盘
  2. Sharepoint2010创建webpart详细步骤
  3. secureCRT 使用 rz 命令上传大文件失败出现乱码
  4. python文字验证码识别_利用python进行验证码识别(预处理部分)
  5. SDL播放PCM音频数据
  6. 过程控制系统期末试题
  7. 计算机工程学院学生会口号,计算机工程学院学生会活动策划书模板
  8. LeetCode 377. Combination Sum IV
  9. HTML页面DOM内容整体生成图片——html2canvas依赖
  10. Node.js高级编程【一】node 基础