快速业务通道

从Java类库看设计模式(1) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
在这个方法中调用Subject的getXXX()方法来取得最新的状态,而实际上, 你可以只是在其中对Subject的某些事件进行响应。这便是Java中的代理事件模型的一个雏形 --对事件进行响应。只不过,在Observer模式中将事件特定化为某个状态/数据的改变了。

java.util.Observable

public void addObserver(Observer obs)

向Subject注册一个Observer。也就是把这个Observer对象添加到了一个 java.util.Observable内部的列表中。在JDK中对于这个列表是简单的通过一个 java.util.Vector类来实现的,而实际上,在一些复杂的Observer模式的应用中,需要把这 个部分单另出来形成一个Manager类,来管理Subject和Observer之间的映射。这样,Subject 和Observer进一步的被解藕,程序也会具有更大的灵活性。

public void deleteObserver(Observer obs)

从Subject中删除一个已注册了Observer的引用。

public void deleteObservers()

从Subjec中删除所有注册的Observer的引用。

public int countObservers()

返回注册在Subject中的Observer个数。

protected void setChanged()

设置一个内部的标志以指明这个Ovserver的状态已经发生改变。注意这是一个protected 方法,也就是说只能在Observer类和其子类中被调用,而在其它的类中是看不到这个方法的 。

protected void clearChanged()

清除上叙的内部标志。它在notifyObservers()方法内部被自动的调用,以指明Subject的 状态的改变已经传递到Ovserver中了。

public boolean hasChanged()

确定Subject的状态是否发生了改变。

public void notifyObservers(Object obj)

它首先检查那个内部的标志,以判断状态是否改变,如果是的话,它会调用注册在 Subject中的每个Observer的update()方法。在JDK中这个方法内部是作为synchronized来实 现的,也就是如果发生多个线程同时争用一个java.util.Observerable的notifyObservers() 方法的话,他们必须按调度的等待着顺序执行。在某些特殊的情况下,这会有一些潜在的问 题:可能在等待的过程中,一个刚刚被加入的Observer会被遗漏没有被通知到,而一个刚刚 被删除了的Observer会仍然收到它已经不想要了的通知。

public void notifyObservers()

等价于调用了notifyObservers(null)。

从Java类库看设计模式(1)(3)

时间:2011-04-23 IBM 刘武东

因而在Java中应用Observer就很简单了,需要做的是:让需要被观察的Subject对象继承 java.util.Observerable,让需要观察的对象实现java.util.Observer接口,然后用 java.util.Observerable的addObserver(Observer obj)方法把Observer注册到Subject对象 中。这已经完成了大部分的工作了。然后调用java.util.Observerable的notifyObservers (Object arg)等方法,就可以实现Observer模式的机理。我们来看一个简单使用了这个模式 的例子。这个例子有三个类:FrameSubject,DateSubject,FrameObject和EntryClass, FrameSubject中用户可以设置被观察的值,然后自动的会在FrameObject中显示出来, DateSubject封装被观察的值,并且充当Observer模式中的Subject。

public class FrameSubject extends JFrame { …………..   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个 //java.util.Observerable对象了。   DateSubject subject=new DateSubject(); //这个方法转发添加Observer消息到DateSubject。   public void registerObserver(java.util.Observer o){    subject.addObserver(o); }   //数据改变,事件被触发后调用notifyObservers()来通知Observer。 void jButton1_actionPerformed(ActionEvent e) {    subject.setWidthInfo(Integer.parseInt(jTex

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号