首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

观察者模式,主推讯息DEMO

2012-09-01 
观察者模式,主推消息DEMO做RCP应用,现在在各个View中获取的实时数据都是后台程序TCP Socket扔过来的,保存

观察者模式,主推消息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 stubString 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 stubSystem.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)* */@Overridepublic synchronized void deleteObserver(Observer o) {// TODO Auto-generated method stubif(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时执行该方法 */@Overridepublic 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时执行该方法 */@Overridepublic void update(Observable o, Object arg) {System.err.println(arg);}}



热点排行