Observer模式也称为观察者模式,
观察者模式是java已经实现的模式,我们只要利用java.util.Obserable类和java.util.Observer接口就可以实现观察者模式
实现过程:
被观察者必须继承Observable,一旦事件被触发,调用notifyObservers通知观察者
观察者必须实现Observer接口,实现update方法,完成事件处理
举个经典的例子....猫叫,老鼠跑.人惊醒....
代码:
 1 package javamodel.observer;
package javamodel.observer;
 2
 3 import java.util.Observable;
import java.util.Observable;
 4 import java.util.Observer;
import java.util.Observer;
 5
 6
 /** *//**
/** *//**
 7 * 猫叫,老鼠跑,主人被惊醒,用代码实现这个连锁反应 。
* 猫叫,老鼠跑,主人被惊醒,用代码实现这个连锁反应 。
 8 * @author Administrator
* @author Administrator
 9 *
*
10 */
*/
11
12
 public class TestObserver
public class TestObserver  {
{
13
14
 public static void main(String[] args)
public static void main(String[] args) {
{
15 Cat c=new Cat();
   Cat c=new Cat();
16 Observer o1=new Mouse();
   Observer o1=new Mouse();
17 Observer o2=new Man();
   Observer o2=new Man();
18 c.addObserver(o1);
   c.addObserver(o1);
19 Mouse oo1=(Mouse)o1;//向下转型
   Mouse oo1=(Mouse)o1;//向下转型
20 oo1.addObserver(o2);
   oo1.addObserver(o2);
21 c.CatSay();
   c.CatSay();
22 }
}
23
24 }
}
25
26
 class Cat extends Observable
class Cat extends Observable {//猫被老鼠观察,猫是被观察者
{//猫被老鼠观察,猫是被观察者
27
28
 public void CatSay()
public void CatSay() {
{
29 System.out.println("猫叫了");
   System.out.println("猫叫了");
30 this.setChanged();
   this.setChanged();
31 this.notifyObservers();
   this.notifyObservers();
32 }
}
33 }
}
34
35
 class Mouse extends Observable implements Observer
class Mouse extends Observable implements Observer {//老鼠观察猫,猫是观察者,对于人,老鼠是被观察者
{//老鼠观察猫,猫是观察者,对于人,老鼠是被观察者
36
37
 public void update(Observable arg0, Object arg1)
public void update(Observable arg0, Object arg1)  {
{
38 // TODO Auto-generated method stub
   // TODO Auto-generated method stub
39 System.out.println("猫叫了,老鼠跑了");
   System.out.println("猫叫了,老鼠跑了");
40 this.setChanged();
   this.setChanged();
41 this.notifyObservers();
   this.notifyObservers();
42 }
}
43
44 }
}
45
46
 class Man implements Observer
class Man implements Observer {//人观察老鼠,人是观察者
{//人观察老鼠,人是观察者
47
48
 public void update(Observable arg0, Object arg1)
public void update(Observable arg0, Object arg1)  {
{
49 // TODO Auto-generated method stub
   // TODO Auto-generated method stub
50 System.out.println("老鼠跑了,人惊醒了");
   System.out.println("老鼠跑了,人惊醒了");
51 }
}
52 }
}
53
54
 
总结, 观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
观察者模式的缺陷:
1、 松偶合导致代码关系不明显,有时可能难以理解。(废话)
2、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)