首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式 观察者模式 Observer

2012-10-25 
设计模式 观察者模式 Observer?/** *@authorET */???我的女儿林格最近越来越可爱了,但是也越来越淘气了,醒

设计模式 观察者模式 Observer

?

/** *@author     ET */

?

?

?

我的女儿林格最近越来越可爱了,但是也越来越淘气了,醒了就需要吃饭,总是离不开人,我总是要看着她,妈妈也要形影不离,生怕有意外发生。

?

如果上面的描述如何用程序实现呢?

?

把我设计成一个线程,不停的监视着宝宝的状态,妈妈设计成另外一个线程,也不停的监视着宝宝的状态,当宝宝醒来的时候在调用喂饭的方法么?

?

答案肯定是no,那样我一天什么都不能去做,妈妈也是同样,连洗尿布的时间都没有,因为两个人都忙着监护宝宝的状态呢。对,线程就是这样工作的。

?

那有没有一种其他的方法改善如此场面呢?那就是观察者模式。

?

首先介绍两个类。

?

//被观察者import java.util.Observable;//观察者import java.util.Observer;

?

?

?

这是SUN提供给我们的,已经封装好的一个类,和一个接口,当然我们也可以自己实现功能。

下面看看JDK的具体实现。

?

?

package java.util;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(Object arg)  方法的重载     */    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);    }    /**     * 删除所有观察者     */    public synchronized void deleteObservers() {obs.removeAllElements();    }    /**     * 设置改变状态     */    protected synchronized void setChanged() {changed = true;    }    /**     * 清除改变状态     */    protected synchronized void clearChanged() {changed = false;    }    /**     * 获取改变状态     */    public synchronized boolean hasChanged() {return changed;    }    /**     * 观察者数量     */    public synchronized int countObservers() {return obs.size();    }}

?

?以上可以理解为一个被观察者的父类。

?

?

package java.util;public interface Observer {       void update(Observable o, Object arg);}

?

?

观察者是一个接口。

?

?

?

这次让我们来看具体的实现:

?

女儿的类,继承被观察者类

?

?

import java.util.Observable;public class MyDaughter extends Observable {        public void wake(){System.out.println("我睡醒啦");this.setChanged();this.notifyObservers(this);//this.clearChanged();    }    }
?

?

?

作为父母的观察者

?

?

public class Mother implements Observer {    public void update(Observable arg0, Object arg1) {System.out.println("妈妈给准备饭吃!");    }}public class Father implements Observer {    public void update(Observable o, Object arg) {System.out.println("爸爸抱抱!");    }}
?

?

测试类

?

?

?

public class Test {    public static void main(String[] args) {//创建被观察者对象MyDaughter mDaughter = new MyDaughter();//创建观察者对象Mother mother = new Mother();Father father = new Father();//添加观察者mDaughter.addObserver(mother);mDaughter.addObserver(father);//宝宝醒来mDaughter.wake();    }}

?

?

?

运行后 在控制台输出:

?

这是我目前看到最易懂的设计模式描述,多谢! 2 楼 kissmydream 2011-07-25   Thanks a lot,I get it.

热点排行