观察者模式

观察者模式:

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

  这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

观察者模式的组成:

  • 抽象主题(Subject)角色抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实 现。主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。
  • 抽象观察者(Observer)角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
  • 具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色。
  • 具体观察者(ConcreteObserver)角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

 

示例:

抽象主题角色,被观察

 

1 public interface Subject
2 {
3     public void addObserver(Observer observer);
4 
5     public void removeObserver(Observer observer);
6 
7     public void notifyObservers(String str);
8 
9 }

 

抽象观察者角色:

1 public interface Observer
2 {
3     public void update(String str);
4 }

具体主题角色:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class ConcreteSubject implements Watched
 5 {
 6     // 存放观察者
 7     private List<Observer> list = new ArrayList<Observer>();
 8 
 9     @Override
10     public void addObserver(Observer observer)
11     {
12         list.add(observer);
13     }
14 
15     @Override
16     public void removeObserver(Observer observer)
17     {
18         list.remove(observer);
19     }
20 
21     @Override
22     public void notifyObservers(String str)
23     {
24         // 自动调用实际上是主题进行调用的
25         for (Observer observer : list)
26         {
27             observer.update(str);
28         }
29     }
30 }

具体观察者角色:

1 public class ConcreteObserver implements Observer
2 {
3     public void update(String str)
4     {
5         System.out.println(str);
6     }
7 
8 }

测试类:

 

 1 public class Test
 2 {
 3     public static void main(String[] args)
 4     {
 5         Subject girl = new ConcreteSubject();
 6         
 7         Observer observer = new ConcreteObserver();
 8         Observer observer = new ConcreteObserver();
 9         Observer observer = new ConcreteObserver();
10         
11         girl.addObserver(observer1);
12         girl.addObserver(observer2);
13         girl.addObserver(observer3);
14         
15         girl.notifyObserver1s("开心");
16     }
17 
18 }

 

 在JAVA中,事件处理模型就是基于观察者模式的委派事件模型(Delegation Event Model或DEM)。

 DEM模型里面,主题(Subject)角色负责发布(publish)事件,而观察者角色向特定的主题订阅(subscribe)它所感兴趣的事件。当一个具体主题产生一个事件时,它就会通知所有感兴趣的订阅者。

  使用这种发布-订阅机制的基本设计目标,是提供一种将发布者与订阅者松散地耦合在一起的联系形式,以及一种能够动态地登记、取消向一个发布者的订阅请求的办法。显然,实现这一构思的技巧,是设计 抽象接口,并把抽象层和具体层分开。这在观察者模式里可以清楚地看到。

  使用DEM的用词,发布者叫做事件源(event source),而订阅者叫做事件聆听者(event listener)。在Java里面,事件由类代表,事件的发布是通过同步地调用成员方法做到的。

 

参考:http://www.blogjava.net/supercrsky/articles/202544.html

 

posted @ 2014-04-14 16:37  sky钦  阅读(111)  评论(0)    收藏  举报