观察者模式

  在实际应用中,当一个对象关注另一个对象的变化时,可以采取轮询的方式,也可以采用观察者模式来实现。

  采用观察者模式时,被关注者发生变化时会去通知在其上注册的观察者。Swing中就大量的用到了观察者模式来实现监听组件状态的变化。

  

  观察者模式的类图如下:

  

  

  Subject上注册关注其变化的Observer,当Subject状态发生变化时,逐个的去通知Observer。

public void nodifyObservers(String newState){
        
        for(Observer observer : list){
            observer.update(newState);
        }
    }

  

  JDK中也支持观察者模式,使用JDK提供的Observable类和Observer接口可以轻松完成观察者模式。

  Observable相当于主题,是被关注的。addObserver(Observer o)增加观察者,发生变化时  setChanged();设置 boolean changed = true再调用notifyObservers();即可。

 

  JButton继承自AbstractButton,AbstractButton中也维护了一组监听器ActionListener(观察者),当JButton状态发生变化时,通过firActionPerformed()方法去逐个调用ActionListener的actionPerformed方法。

  这也就是为什么为什么在JButton上注册了一些ActionListener,当JButton状态发生变化时,就会调用到ActionListener的actionPerformed方法。

 

  当主题上注册了很多个观察者时,主题每次发生变化时都去调用所有的观察者,而观察者只是关注主题的某些类型的变化时,这就是效率的浪费。

  可以在主题上注册不同类型的观察者,当发生变化时只去通知关注的观察者。感觉这个和消息的实现机制就已经很类似了,可以去订阅关注的信息。

  NIO中的Selector类似于主题,主题上注册了各种观察者,当主题发生变化时,去通知感兴趣的观察者。Selector具体实现就要复杂的多了。

posted on 2015-08-30 20:53  lnlvinso  阅读(260)  评论(0编辑  收藏  举报