观察者模式

知识,还是要实际应用才印象深刻。看了很多书,当时记忆和理解还不错,但时间久了总会忘记。像设计模式这个东西,单纯的看书,觉得挺简单,但实际编码时,往往无所适从,忘记了这些知识。知识还是得多复习、多巩固,然后多练,我个人属于看多写少的,惭愧。所以决定还是用博客的形式记录一下,也还能常回头翻翻。以前在网易写非技术性博客,新浪的博客倒是技术的,但是记录不系统、漫无目的,有点像做备忘录随记一样。

观察者模式角色:

主题、观察者

实现一个观察者模式的例子很简单。JDK已经实现了一套,可以直接复用。在java.util.Observable(主题接口)类中,实现了主要的功能,增加观察者、删除观察者、通知观察者,我们可以继承该类来使用这些功能,这里的子类的角色是“具体主题”。实现接口java.util.Observable(观察者接口),其方法update()在主题类中被回调,这里的实现者的角色是“具体观察者”。

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);      
    }      
}     

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);      
}   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值