设计模式之:解剖观察者模式

来源:互联网 发布:sql server 全局变量 编辑:程序博客网 时间:2024/06/05 17:00
本文转自:http://www.iteye.com/topic/102068/
GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下: 

1, 观察者(具体执行操作的对象,有多个) 
2,被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操) 
有两个类,java.util.Observable,在我们实现观察者模式的时候,我们的被观察者应该继承这个类,这个observable类把持住了被观察者所持有的观察者列表: 
Java代码  收藏代码
  1. public class Observable  
  2.     private boolean changed false 
  3.     private Vector obs;  
  4.      
  5.     //创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。  
  6.     public Observable()  
  7.     obs new Vector();  
  8.      
  9.   
  10.       
  11.     public synchronized void addObserver(Observer o)  
  12.         if (o == null 
  13.             throw new NullPointerException();  
  14.     if (!obs.contains(o))  
  15.         obs.addElement(o);  
  16.      
  17.      
  18.   
  19.       
  20.     public synchronized void deleteObserver(Observer o)  
  21.         obs.removeElement(o);  
  22.      
  23.   
  24.       
  25.     public void notifyObservers()  
  26.     notifyObservers(null);  
  27.      
  28.   
  29.       
  30.     public void notifyObservers(Object arg)  
  31.       
  32.         Object[] arrLocal;  
  33.   
  34.     synchronized (this 
  35.         if (!changed)  
  36.                 return 
  37.             arrLocal obs.toArray();  
  38.             clearChanged();  
  39.          
  40.   
  41.         for (int arrLocal.length-1i>=0i--)  
  42.             ((Observer)arrLocal[i]).update(thisarg);  
  43.      
  44.  


这里只列出了一些常用的操作,大家如有不明白可以自己看java.util包下的Observable,每一个方法前都有详细的解释。但是以上列出的方法对于这个例子来说已经够用了。 

当我们自己的被观察者继承这个Observable类是,我们就自动的获取到被观察者的一切条件了。很方便是不是,这也是为什么sun要把Observable放到java.util包中的原因,就是为了方便开发者。 

讲完了被观察者再让我们来看看观察者,在上面的代码中有一个addObserver(Observero)方法,由此我们可以看出来,给被观察者添加观察者时就是用这个方法,那么也就是说观察者一定是Observer的子类或者实现,我们看一下java.util.Observer吧: 
Java代码  收藏代码
  1. public interface Observer  
  2.       
  3.     void update(Observable o, Object arg);  
  4.  
  5.  

很好,这是一个接口,接口中就只有一个方法,update,方法中有两个参数,Observable和一个object,第一个参数就是被观察的对象,而第二个参数就得看业务需求了,需要什么就传进去什么。我们自己的观察者类必须实现这个方法,这样在被观察者调用notifyObservers操作时被观察者所持有的所有观察者都会执行update操作了(当然如果你override这个方法,你甚至可以指定何种情况下只执行某种observer了,是不是比较像责任链模式了)。 

那么到这里我们也差不多可以把观察者模式应用到项目中去了。首先让我们来实现被观察者(因为实现被观察者非常简单) 

首先让我们来实现一个发送邮件的观察者: 
Java代码  收藏代码
  1.   
  2. public class MailObserver implements Observer{  
  3.   
  4.       
  5.     public void update(Observable o, Object arg)  
  6.         System.out.println("发送邮件的观察者已经被执行");  
  7.      
  8.  

接着再让我们来实现一个发送jms消息的观察者: 
Java代码  收藏代码
  1.   
  2. public class JMSObserver implements Observer{  
  3.   
  4.     public void update(Observable o, Object arg)  
  5.         System.out.println("发送消息给jms服务器的观察者已经被执行");  
  6.      
  7.  

如上所见,观察者的实现完全跟业务相关。是否复杂就得看你得业务是否复杂了。 

接下来让我们再来实现被观察者,示例如下: 
Java代码 
 
public class Subject extendsObservable{  
    
    
   public void doBusiness(){ 
       if (true){  
          super.setChanged(); 
      
      notifyObservers("现在还没有的参数");  
   }  
  
    
   public static void main(String [] args) { 
       //创建一个被观察者 
       Subjectsubject = new Subject();  
        
       //创建两个观察者 
       ObservermailObserver = new MailObserver(); 
       ObserverjmsObserver = new JMSObserver(); 
        
      //把两个观察者加到被观察者列表中  
      subject.addObserver(mailObserver); 
      subject.addObserver(jmsObserver); 
        
       //执行业务操作 
      subject.doBusiness();  
   }  

到此为止,我们已经简单得实现了观察者模式,让我们来运行一下上面main方法,运行结果如下: 

发送消息给jms服务器的观察者已经被执行 
发送邮件的观察者已经被执行 


0 0
原创粉丝点击