向 Subject 注册一个 Observer。也就是把这个 Observer 对象添加到了一个
java.util.Observable
内部的列表 中。在 JDK 中对于这个列表是简单的通过一个
java.util.Vector 类来实现的,而实际上,在一些复杂的 Observer
模式的应用中,需要把 这个
部分单另出来形成一个 Manager 类,来管理 Subject 和 Observer 之间的映射。这样,Subject
和 Observer
进一步的被解 藕,程序也会具有更大的灵活性。
public void deleteObserver(Observer obs)
从 Subject 中删除一个已注册了 Observer
的引用。
protected void setChanged()
设置一个内部的标志以指明这个 Ovserver 的状态已经发生改变。注意这是一个 protected 方法,
也就是说只能在 Observer
类和其子类中被调用,而在其它的类中是看不到这个方法的。
public void notifyObservers(Object obj)
它首先检查那个内部的标志,以判断状态是否改变,如果 是的话,它会调用注册在 Subject 中
的每个 Observer 的 update()方法。在 JDK 中这个方法内部是作为 synchronized
来实现 的,
也就是如果发生多个线程同时争用一个 java.util.Observerable 的 notifyObservers()方法的话,
他们必须按调度的 等待着顺序执行。在某些特殊的情况下,这会有一些潜在的问题:可能在等
待的过程中,一个刚刚被加入的 Observer
会被遗漏没有被通知到,而一个刚刚被 删除了的
Observer
会仍然收到它已经不想要了的通知。
1
package
javamodel.observer;
3
§
import
java.util.Observable;
4
§
import
java.util.Observer;
7
§* 猫叫,老鼠跑,主人被惊醒,用代码实现这个连锁反应
。
8
§*
@author
Administrator
11
§
12
§§
public
class
TestObserver {
14
§§
public
static
void
main(String[] args){
15
§ Cat c=
new
Cat();
16
§ Observer o1=
new
Mouse();
17
§ Observer o2=
new
Man();
18
§ c.addObserver(o1);
19
§ Mouse oo1=(Mouse)o1;
//向下转型
20
§
oo1.addObserver(o2);
21
§ c.CatSay();
22
§}
24
§}
25
§
26
§§
class
Cat
extends
Observable{
//猫被老鼠观察,猫是被观察者
28
§§
public
void
CatSay(){