标签:
在实际应用中,当一个对象关注另一个对象的变化时,可以采取轮询的方式,也可以采用观察者模式来实现。
采用观察者模式时,被关注者发生变化时会去通知在其上注册的观察者。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具体实现就要复杂的多了。
标签:
原文地址:http://www.cnblogs.com/lnlvinso/p/4771629.html