观察者模式,主推讯息DEMO

观察者模式,主推消息DEMO
  做RCP应用,现在在各个View中获取的实时数据都是后台程序TCP Socket扔过来的,保存在一个队里里,View中启用了UI线程去队里里实时获取该数据,这对于View来说是一个主动获取资源的方式,想改成被动获取,不用启UI线程去干这事,我想利用观察者模式来做着事,先测试了个观察者模式demo。

被观察者:
package observer;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

/**
 * @ClassName: MainObserver
 * @Description: TODO
 * @author Administrator
 * @create-date 2012-6-19 下午3:59:56
 * @modify-date 2012-6-19 下午3:59:56
 **/

public class MainObserver extends Observable {
	
	//设置了个饱汉单例
	private static MainObserver ob = new MainObserver();
	
	private MainObserver(){}

	//观察者对象集合,一个观察者对应的key,如果消息过来业务逻辑处理是某个观察者的就通知该观察者
	private static Map<String,Object> obs = new HashMap<String,Object>();
	
	
	public static MainObserver  getObServer(){
		return ob;
	}
	/**
	 * 当被观察者有Changed时,通知观察者
	 * 
	 * @param arg
	 */
	public void doBusiness(Object arg) {
		// 设置修改状态
		super.setChanged();
		// 通知观察者
		this.notifyObservers(arg);
	}
	

	/**
	 *  模仿不同的业务通知对应业务的观察者
	  * @Title: notifyObservers
	  * @Description: TODO
	  * @author:Administrator
	  * @create-date:2012-6-20 上午10:37:25
	  * @modify-date:2012-6-20 上午10:37:25
	  * @param @param arg
	  * @throws
	  * @see java.util.Observable#notifyObservers(java.lang.Object)
	*
	 */
	public void notifyObservers(Object arg) {
		// TODO Auto-generated method stub
		String msg = arg.toString();
		String[] msgs = msg.split(":");
		if(obs.containsKey(msgs[0])){
			Observer ob = (Observer)obs.get(msgs[0]);
			ob.update(this, msgs[1]);
		}
		
	}

	/**
	 *  添加一个观察者
	  * @Title: addObserver
	  * @Description: TODO
	  * @author:Administrator
	  * @create-date:2012-6-20 上午10:38:39
	  * @modify-date:2012-6-20 上午10:38:39
	  * @param @param name
	  * @param @param o    
	  * @return void    
	  * @throws
	*
	 */
	public synchronized void addObserver(String name,Observer o) {
		// TODO Auto-generated method stub
		System.err.println("添加一个观察者:"+name);
		obs.put(name, o);
	}
	
	/**
	 *  删除观察者
	  * @Title: deleteObserver
	  * @Description: TODO
	  * @author:Administrator
	  * @create-date:2012-6-20 上午10:49:39
	  * @modify-date:2012-6-20 上午10:49:39
	  * @param @param o
	  * @throws
	  * @see java.util.Observable#deleteObserver(java.util.Observer)
	*
	 */
	@Override
	public synchronized void deleteObserver(Observer o) {
		// TODO Auto-generated method stub
		if(obs.values().contains(o)){
			Iterator<String> iterator = obs.keySet().iterator();
			while(iterator.hasNext()){
				String key = iterator.next();
				if(obs.get(key).equals(o)){
					obs.remove(key);
					break;
				}
				
			}
		}
	}
	
	

	public static void main(String[] args) throws InterruptedException {
		
		//实例一个被观察者  
		MainObserver ob = MainObserver.getObServer(); 
		
		ProcessObserver pro =  new ProcessObserver();
		TaskbarObserver task = new TaskbarObserver();
		ob.addObserver("proc", pro);
		ob.addObserver("task", task);
		System.out.println(obs.size());
        //处理业务,当关闭一个eclipse时,通知两个观察者同时也移除该任务  
		System.out.println("发送一条进程信息...");
        ob.doBusiness("proc:进程启动");
		Thread.sleep(5000);
        System.out.println("发送一条任务信息...");
        ob.doBusiness("task:我给任务器推送消息了");
        
        //移除一个观察者
        Thread.sleep(5000);
        ob.deleteObserver(pro);
        System.out.println("发送一条进程信息...");
        ob.doBusiness("proc:移除你能接受的到消息吗");
        
	}


}



观察者1:
package observer;

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



/**
 * @ClassName: ProcessObserver
 * @Description: TODO
 * @author Administrator
 * @create-date 2012-6-19 下午4:01:14
 * @modify-date 2012-6-19 下午4:01:14
 **/

public class ProcessObserver implements Observer {
	/**
	 * 实现观察者接口,当发现被观察者有Changed时执行该方法
	 */
	@Override
	public void update(Observable o, Object arg) {
		System.err.println(arg);
	}
	
}



观察者2:
package observer;

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

/**
 * 
  * @ClassName: TaskbarObserver
  * @Description: TODO
  * @author Administrator
  * @create-date 2012-6-20 上午10:28:58
  * @modify-date 2012-6-20 上午10:28:58
*
 */
public class TaskbarObserver implements Observer {

	/**
	 * 实现观察者接口,当发现被观察者有Changed时执行该方法
	 */
	@Override
	public void update(Observable o, Object arg) {
		System.err.println(arg);
	}
	

}