background image

向 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(){