观察者模式
观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
观察者模式的组成:
- 抽象主题(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

浙公网安备 33010602011771号