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