观察者模式
来源:互联网 发布:17网络批发市场 编辑:程序博客网 时间:2024/05/22 11:46
- /**
- * @author 张荣华(ahuaxuan)
- * @version $Id$
- */
- public class Subject extends Observable{
- /**
- * 业务方法,一旦执行某个操作,则通知观察者
- */
- public void doBusiness(){
- if (true) {
- super.setChanged();
- }
- notifyObservers("现在还没有的参数");
- }
- public static void main(String [] args) {
- //创建一个被观察者
- Subject subject = new Subject();
- //创建两个观察者
- Observer mailObserver = new MailObserver();
- Observer jmsObserver = new JMSObserver();
- //把两个观察者加到被观察者列表中
- subject.addObserver(mailObserver);
- subject.addObserver(jmsObserver);
- //执行业务操作
- subject.doBusiness();
- }
- }
- /**
- * @author 张荣华(ahuaxuan)
- * @version $Id$
- */
- public class JMSObserver implements Observer{
- public void update(Observable o, Object arg) {
- System.out.println("发送消息给jms服务器的观察者已经被执行");
- }
- }
- /**
- * @author 张荣华(ahuaxuan)
- * @version $Id$
- */
- public class MailObserver implements Observer{
- /**
- * 这个类取名为MailObserver,顾名思义,她是一个用来发送邮件的观察者
- */
- public void update(Observable o, Object arg) {
- System.out.println("发送邮件的观察者已经被执行");
- }
- }
观察者接口(类)
- public interface Observer {
- /**
- * This method is called whenever the observed object is changed. An
- * application calls an <tt>Observable</tt> object's
- * <code>notifyObservers</code> method to have all the object's
- * observers notified of the change.
- *
- * @param o the observable object.
- * @param arg an argument passed to the <code>notifyObservers</code>
- * method.
- */
- void update(Observable o, Object arg);
- }
- }
被观察者类
- public class Observable {
- private boolean changed = false;
- private Vector obs;
- //创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。
- public Observable() {
- obs = new Vector();
- }
- /**
- * 添加观察者到观察者列表中去
- */
- public synchronized void addObserver(Observer o) {
- if (o == null)
- throw new NullPointerException();
- if (!obs.contains(o)) {
- obs.addElement(o);
- }
- }
- /**
- * 删除一个观察者
- */
- public synchronized void deleteObserver(Observer o) {
- obs.removeElement(o);
- }
- /**
- * 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作,不传参数的通知方法
- */
- public void notifyObservers() {
- notifyObservers(null);
- }
- /**
- * 与上面的那个通知方法不同的是,这个方法接受一个参数,这个参数一直传到观察者里,以供观察者使用
- */
- public void notifyObservers(Object arg) {
- Object[] arrLocal;
- synchronized (this) {
- if (!changed)
- return;
- arrLocal = obs.toArray();
- clearChanged();
- }
- for (int i = arrLocal.length-1; i>=0; i--)
- ((Observer)arrLocal[i]).update(this, arg);
- }
- }
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 在ubuntu9.10上使用指纹识别
- Perl语言简介
- Tab Control控件的使用
- struts2+spring+hibernate+json+jquery+flexigrid开发笔记-flexigrid改造
- 找回旧帖:谢谢斩月,谢谢monkeycz,谢谢dtcser,谢谢超级大BUG
- 观察者模式
- 开博之谈
- 通用软件开发平台(General Software Developing Platform)设想:1
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十六)飞行模式 – 自由VS天空
- 给你一个故事,希望你能喜欢这个故事并希望它能为你带来好运
- MFC常用类及其成员函数
- 37个网页web2.0按钮色设计欣赏
- 去除指定字符串中的HTML标签
- CString 操作指南