`
sunnylocus
  • 浏览: 869851 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

Java设计模式—观察者模式(Observer pattern)

    博客分类:
  • Java
阅读更多

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

故事:

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

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

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

 

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

 

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

 

结构图:

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

 

 

1.Observer

package com.pattern.observer;

public interface Observer {
	public abstract void update(NumberGenerator generator);
}

2.NumberGenerator

 

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

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

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

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(测试类)

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.结果输出

 

设计思想:

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

14
0
分享到:
评论
15 楼 xqxmh 2013-03-19  
这个例子有问题,如果Observer他的实现类非常多的话,效力非常慢
14 楼 manman1205 2012-12-28  
这兄弟的文章我看过挺多的,技术方面研究的很不错。感谢楼主一次次的分享技术,感谢为java的发展做出的共享。
13 楼 liyueling 2011-10-15  
很不错的例子
12 楼 zghen 2008-10-16  
呵呵。。很好的例子
11 楼 sunnylocus 2008-09-01  
谢谢朋友们的支持,有不合理或不对的地方,请批评指正,共同提高。
10 楼 huangjingyu 2008-08-31  
唔,非常不错的一例子,谢谢楼主!
9 楼 qiancaoduwu 2008-08-31  
不错,谢谢楼主,代码应该能看明白了!
8 楼 gxjljx 2008-08-31  
JDK不是有提供观察者模式的类吗,直接用就OK了
7 楼 yuwenchun 2008-08-29  
谢谢lz分享
6 楼 jigble 2008-08-29  
这个例子非常好,简单明了!很不错,赞一个!
那个小雪姑娘的故事觉得没有写了,给出代码表达,已经足够清楚了
5 楼 zidane0207 2008-08-29  
很好的例子,学习了。
4 楼 sunnylocus 2008-08-29  
是有点牵强,不过邮局订报也不错,容易理解的也算是好例子。
3 楼 linginfanta 2008-08-29  
小雪脚踏多只船,这个例子有点牵强啊。
还是气象站的例子经典。
2 楼 waitingmyself 2008-08-28  
气象站的经典
1 楼 zhuyx808 2008-08-28  
我还以为讲的又是气象站天气预报那

相关推荐

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    设计模式之观察者模式(Observer Pattern)

    定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

    ObserverPattern

    设计模式之观察者模式ObserverPattern

    33种JAVA设计模式DEMO

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...

    观察者模式(Observer)原理图

    观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...

    Java设计模式之观察者模式(Observer模式)介绍

    主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...

    用Java实现23种设计模式

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    java观察者模式.doc

    在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) ...17. 观察者模式 (Observer Pattern)

    JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

    主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。...观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    设计模式_观察者模式.zip

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 观察者模式demo java

    Java聊天室 观察者模式和单例模式

    基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式

    C#设计模式_设计模式_C#_

    观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式...

    设计模式PPT

    创建型模式用来处理对象的创建... 观察者模式(Observer Pattern)  状态模式(State Pattern)  策略模式(Strategy Pattern)  模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

Global site tag (gtag.js) - Google Analytics