设计模式(四)——观察者设计模式
2014-03-19 15:31
330 查看
今天在做Oozie的项目的时候,想要对后台的作业任务进行实时监控,想了好久都没有办法,因为没有源码,只有接口,所以最终没有搞成,用了自我感觉比较恶心的定时请求的方法....额,说了这么多好像和主题没什么关系,那好吧,进入正题。我们很多时候都希望有一个类或者什么可以发现某个状态的变化,一旦状态发生变化,我们就可以得到通知,就像是有一个观察者一直在看着这个状态,一旦变化,他就告诉所有需要知道该变化的人。这就是——观察者设计模式。
好了,废话不多说,上类图(其实自己也发现,有了类图,理解问题就变得简单和直观很多了)。
![](https://img-blog.csdn.net/20140319151938265?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWndlbmp1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这个类图,看了以后,其实还有很多细节,用语言来描述的话,其实关键点就在于:当产生数字的时候,给所有的观察者通知,这个通知的完成,是因为观察者都有一个产生数字的抽象类的引用。下面我们来看看代码的实现吧。
产生数字的抽象类:
NumberObserver:3
NumberObserver:9
NumberObserver:1
NumberObserver:1
NumberObserver:1
这里产生五次是因为,我设置的是产生5个随机数,每产生一个随机数都通知所有的观察者。
如上所述,观察者设计模式就是这个样子的。
好了,废话不多说,上类图(其实自己也发现,有了类图,理解问题就变得简单和直观很多了)。
这个类图,看了以后,其实还有很多细节,用语言来描述的话,其实关键点就在于:当产生数字的时候,给所有的观察者通知,这个通知的完成,是因为观察者都有一个产生数字的抽象类的引用。下面我们来看看代码的实现吧。
产生数字的抽象类:
package com.xdccl.zwj.ObserverDesignPattern; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public abstract class NumberGenerator { private List<Observer> observers = new ArrayList<Observer>() ; //添加观察者 public void addObserver(Observer observer){ observers.add(observer) ; } //删除观察者 public void delObserver(Observer observer){ observers.remove(observer); } //通知观察者 public void notifyObserver(){ Iterator<Observer> iterator = observers.iterator() ; while(iterator.hasNext()){ Observer o = iterator.next() ; o.update(this) ; } } public abstract int getNum() ; public abstract void generate() ; }继承上面抽象类的随机产生随机数字的类:
package com.xdccl.zwj.ObserverDesignPattern; import java.util.Random; public class RandomNumberGenerator extends NumberGenerator { private Random random = new Random();//随机数 private int number; //数字 @Override public int getNum() { return number; } @Override public void generate() { for(int i=0 ; i < 5; i++) { number = random.nextInt(10);//产生10以内的随机数 notifyObserver(); //如果有新产生的数字,就发出通知给所有注册过的观察者 } } }观察者接口:
package com.xdccl.zwj.ObserverDesignPattern; public interface Observer { public abstract void update(NumberGenerator generator) ; }数字观察者:
package com.xdccl.zwj.ObserverDesignPattern; public class NumberObserver implements Observer { @Override public void update(NumberGenerator generator) { System.out.println("NumberObserver:"+ generator.getNum()); try { Thread.sleep(1000 * 3); //为了能清楚的看到输出,休眠3秒钟。 }catch(InterruptedException e) { e.printStackTrace(); } } }客户端:
package com.xdccl.zwj.ObserverDesignPattern; public class Client { public static void main(String args[]){ //实例化数字产生对象 NumberGenerator generator = new RandomNumberGenerator(); //实例化观察者 Observer observer = new NumberObserver(); //注册观察者 generator.addObserver(observer); generator.generate(); //产生数字 } }如果发现下列结果,应该就没有问题:
NumberObserver:3
NumberObserver:9
NumberObserver:1
NumberObserver:1
NumberObserver:1
这里产生五次是因为,我设置的是产生5个随机数,每产生一个随机数都通知所有的观察者。
如上所述,观察者设计模式就是这个样子的。
相关文章推荐
- 设计模式(2)------观察者设计模式
- 设计模式C++实现十:观察者模式
- 观察者设计模式-猫和老鼠
- 【设计模式】设计模式C++编程实现之观察者模式(ObserverPattern)
- 设计模式之观察者模式
- Cocos2d-x设计模式:观察者模式
- Java设计模式之观察者模式
- 圣思园java se培训总结(82-)(观察者设计模式)
- Java常用类库--观察者设计模式( Observable类Observer接口)
- Java设计模式(15)行为型:观察者模式
- 设计模式之五 观察者模式
- Java设计模式之观察者模式
- 设计模式入门--观察者模式
- 设计模式-Observer(观察者模式)
- 设计模式学习笔记-观察者模式
- 设计模式学习之观察者模式
- C#中利用代理实现观察者设计模式
- 设计模式之二 观察者模式
- 设计模式学习总结(15) 观察者模式
- java设计模式之观察者模式(9)