分享

设计模式-观察者模式的JDK实现

 jl_oracle 2012-01-12

设计模式-观察者模式的JDK实现

关键字: 设计模式
今天在翻查JAVA API的时候发现了特别的类java.util.Observable和接口
java.util.Observer,细看发现原来是java类库实现观察着(Observer)模式的类和接口。

观察者模式定义:
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象Observer间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Observable和Observer的说明:
继承于Observable的子类表示被观察的对象,实现了接口Observer的类表示观察者.在下面的例子中继承于Observable的子类 NewsDispatcher(新闻派发器)表示被观察的对象,在有新的新闻的时候会把新闻内容派发给所有的订阅者(Reader),Reader是实现了Observer接口的类表示读者。

Observable的简单功能介绍:
addObserver(Observer o)  添加观察着
clearChanged() 清除变化,则把“变化标志”设为false
countObservers() 统计观察着数量
deleteObserver(Observer o) 删除观察者
deleteObservers() 删除所有的观察者
hasChanged() 测试是否有变化(则返回“变化标志”)
notifyObservers() 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法)
notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法),并把参数arg传过去
setChanged() 设置变化,则把“变化标志”设为true

Observable的简单功能介绍
update(Observable o, Object arg) Observable唯一的方法,在被通知时被Observable调用

例子代码:
Java代码
  1. package com.pasu.observer;   
  2.   
  3. import java.util.Observable;   
  4.   
  5. public class NewsDispatcher extends Observable   
  6. {   
  7.       
  8.     public void addNews(String news)   
  9.     {   
  10.         this.setChanged();   
  11.         this.notifyObservers(news);   
  12.     }   
  13.  
package com.pasu.observer;

import java.util.Observable;

public class NewsDispatcher extends Observable
{
        
        public void addNews(String news)
        {
                this.setChanged();
                this.notifyObservers(news);
        }
}


Java代码
  1. package com.pasu.observer;   
  2.   
  3. import java.util.Observable;   
  4. import java.util.Observer;   
  5.   
  6. public class Reader implements Observer   
  7. {   
  8.     private String name;   
  9.        
  10.     public Reader(String name)   
  11.     {   
  12.         this.name name;   
  13.     }   
  14.        
  15.     @Override  
  16.     public void update(Observable o, Object arg)   
  17.     {   
  18.         String news (String)arg;   
  19.         System.out.println(name " news);   
  20.     }   
  21.   
  22.        
  23.  
package com.pasu.observer;

import java.util.Observable;
import java.util.Observer;

public class Reader implements Observer
{
        private String name;
        
        public Reader(String name)
        {
                this.name = name;
        }
        
        @Override
        public void update(Observable o, Object arg)
        {
                String news = (String)arg;
                System.out.println(name + " : " + news);
        }

        
}


Java代码
  1. package com.pasu.observer;   
  2.   
  3. public class Test   
  4. {   
  5.     public static void main(String[] args)   
  6.     {   
  7.         //体育新闻派发器   
  8.         NewsDispatcher sportNewsDispatcher new NewsDispatcher();   
  9.         //it新闻派发器   
  10.         NewsDispatcher itNewsDispatcher new NewsDispatcher();   
  11.         //观察者r1,r2,r3   
  12.         Reader r1 new Reader("r1");   
  13.         Reader r2 new Reader("r2");   
  14.         Reader r3 new Reader("r3");   
  15.         //添加观察者   
  16.         sportNewsDispatcher.addObserver(r1);   
  17.         sportNewsDispatcher.addObserver(r2);   
  18.         itNewsDispatcher.addObserver(r3);   
  19.         //当有新的新闻的时候,通知观察者   
  20.         sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!");   
  21.         itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!");    
  22.     }   
  23.  
package com.pasu.observer;

public class Test
{
        public static void main(String[] args)
        {
                //体育新闻派发器
                NewsDispatcher sportNewsDispatcher = new NewsDispatcher();
                //it新闻派发器
                NewsDispatcher itNewsDispatcher = new NewsDispatcher();
                //观察者r1,r2,r3
                Reader r1 = new Reader("r1");
                Reader r2 = new Reader("r2");
                Reader r3 = new Reader("r3");
                //添加观察者
                sportNewsDispatcher.addObserver(r1);
                sportNewsDispatcher.addObserver(r2);
                itNewsDispatcher.addObserver(r3);
                //当有新的新闻的时候,通知观察者
                sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!");
                itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!");     
        }
}


Test类运行输出的结果
Java代码
  1. r2 中国队突破了历史,获得了世界杯冠军!   
  2. r1 中国队突破了历史,获得了世界杯冠军!   
  3. r3 ibm 收购 sun公司,java开始收费!  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多