`

观察者模式(Observer)

 
阅读更多

一、核心思想

又名‘发布--订阅(publish/subscribe)’模式,定义对象间的一种一对多的依赖关系,

让多个观察者对象同时关注同一个对象,当该对象的状态发生变化时,

所有依赖他的对象都得到通知并被自动更新。

 

关系图:

 

code

  1. public interface Observer {  
  2.     public void update();  
  3. }  

两个实现类:

 
  1. public class Observer1 implements Observer {  
  2.   
  3.     @Override  
  4.     public void update() {  
  5.         System.out.println("observer1 has received!");  
  6.     }  
  7. }  
 
  1. public class Observer2 implements Observer {  
  2.   
  3.     @Override  
  4.     public void update() {  
  5.         System.out.println("observer2 has received!");  
  6.     }  
  7.   
  8. }  

Subject接口及实现类:

 
  1. public interface Subject {  
  2.       
  3.     /*增加观察者*/  
  4.     public void add(Observer observer);  
  5.       
  6.     /*删除观察者*/  
  7.     public void del(Observer observer);  
  8.       
  9.     /*通知所有的观察者*/  
  10.     public void notifyObservers();  
  11.       
  12.     /*自身的操作*/  
  13.     public void operation();  
  14. }  
 
  1. public abstract class AbstractSubject implements Subject {  
  2.   
  3.     private Vector<Observer> vector = new Vector<Observer>();  
  4.     @Override  
  5.     public void add(Observer observer) {  
  6.         vector.add(observer);  
  7.     }  
  8.   
  9.     @Override  
  10.     public void del(Observer observer) {  
  11.         vector.remove(observer);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void notifyObservers() {  
  16.         Enumeration<Observer> enumo = vector.elements();  
  17.         while(enumo.hasMoreElements()){  
  18.             enumo.nextElement().update();  
  19.         }  
  20.     }  
  21. }  
 
  1. public class MySubject extends AbstractSubject {  
  2.   
  3.     @Override  
  4.     public void operation() {  
  5.         System.out.println("update self!");  
  6.         notifyObservers();  
  7.     }  
  8.   
  9. }  


测试类:

 
  1. public class ObserverTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Subject sub = new MySubject();  
  5.         sub.add(new Observer1());  
  6.         sub.add(new Observer2());  
  7.           
  8.         sub.operation();  
  9.     }  
  10.   
  11. }  

二、何时使用

优点是表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口。

使用观察者模式可以实现业务和数据逻辑的通知机制

优点:

被观察者和观察者之间建立了一个抽象的耦合。

观察者模式支持广播通信

缺点:

如果一个被观察者对象有很多直接和间接的观察者的话,将所有观察者都通知到会花费很长时间。

如果有循环依赖,会导致系统崩溃。

没有相应的机制知道所观察的对象是怎么发生变化的。

 

三、Java中的应用

Observable 和Observer观察者实现。

AWT的事件监听机制

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics