文章分类:Java编程 关键字: 观察者模式 observer pattern
观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想
观察者模式还可以用生活中一个例子来表达,就是从邮局订杂志。假如有一个叫 妮妮 的女孩在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.结果输出