`

观察者模式,主推消息DEMO

    博客分类:
  • JAVA
阅读更多
  做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);
	}
	

}



分享到:
评论

相关推荐

    富文本编辑器资源demo

    "index"通常代表最新或主推的版本,而"old"可能包含之前的版本或者备用主题。开发者可以根据项目需求选择合适的样式,或者自定义编辑器的主题以适应网站的整体设计。 使用富文本编辑器时,开发者需要在服务器端集成...

    12款主推款数据包

    3. **用户行为研究**:分析用户评价和反馈,了解消费者需求,改进产品设计和服务。 4. **营销策略制定**:根据点击率和转化率,优化广告投放和促销活动。 5. **预测模型构建**:利用历史数据预测未来销售,为库存...

    如何设定促销政策才能让客户主推自己的产品.doc

    以下是如何设定促销政策以促进客户主推自己产品的详细说明: 1. **制定具有竞争力的促销力度**:在关键销售时期,产品的促销力度直接影响其市场地位。厂家需要通过调研了解竞争对手的政策,确保自己的促销力度更大...

    主推款跟踪表.xls

    主推款跟踪表.xls

    Remobjects SDK使用EventSink实现服务器主推数据给客户端

    总结来说,Remobjects SDK的EventSink机制为C#开发者提供了一种高效、灵活的方式来实现服务器主推数据到客户端的功能,减少了不必要的网络通信和提高了应用的响应速度。通过理解和应用这种模式,开发者能够构建出...

    与高毛利主推政策相关的门店数据分析汇编.pdf

    7. 客流量变化:整体客流量下降,各政策商品的客流量在重新分配,主推商品的终端拦截能力强,但影响了消费者的购药积极性。 8. 提高顾客满意度的策略: - 尊重顾客选择,对指名购买的品牌药不要强行拦截。 - 培养...

    源代码 OBJECTIVE-C编程之道 IOS设计模式解析

    OBJECTIVE-C编程之道 ...即便现在苹果公司主推swift,设计模式无关乎语言,掌握了使用哪种语言实现就不重要了。之所以推荐这本书和源代码,因为有完整的例子,一般讲解设计模式的都是零散的例子。 本书也提供了下载。

    企业级云主推场景及解决方案.ppt

    5. **政务云**:政府机构可能需要建立PPP模式的政务云,以提升公共服务效率并确保数据安全。 【产品替换类场景的销售话术】 在产品替换类场景中,销售策略应强调新云平台的优越性,如更高的性能、更便捷的管理以及...

    订货会主推产品资料.pptx

    订货会主推产品资料.pptx

    springboot- thymeleaf-tiles-demo

    本项目“springboot-thymeleaf-tiles-demo”旨在演示如何将SpringBoot 1.2.0、Thymeleaf 2.x和Tiles 2.2.2这三者有效地整合在一起,为开发者提供一套完整的MVC解决方案。 首先,SpringBoot是基于Spring框架的一个轻...

    主推商品、新品测试监控表.zip

    "主推商品、新品测试监控表"这个压缩包文件,显然与商品管理和市场推广息息相关。这个文件可能包含了一个详细的表格,用于跟踪和分析主推商品以及新品的测试效果和市场反应。下面,我们将深入探讨相关知识点。 首先...

    县农业生产主推技术教材.doc

    县农业生产主推技术教材.doc

    龙泉市农业主导品种主推技术.doc

    【龙泉市农业主导品种主推技术】 文档"龙泉市农业主导品种主推技术.doc"主要涵盖了龙泉市在2010年农业领域的主导品种及主推技术,旨在提高农业生产效率和农产品质量。以下是对其中主要农作物品种和技术的详细介绍:...

    手机主流14年主推平台

    ### 手机主流14年主推平台分析 在2014年的手机市场中,各大芯片厂商纷纷推出了自己的主打平台和技术,以满足不断增长的移动互联网需求。本篇文章将根据给定的信息,对2014年主流的手机芯片平台进行详细分析,包括...

    企业级云主推场景及解决方案.pptx

    企业级云主推场景及解决方案.pptx

    高速、智能、云服务——国外运营商4G商用初期主推业务简析.pdf

    在分析国外运营商在4G商用初期主推业务时,我们可以看到多个关键知识点的展现。其中,高速、智能和云服务作为核心要素,是4G业务推广和发展的关键方向。 首先,关于“高速”,4G网络的高速特性是其区别于之前3G网络...

    名烟名酒店渠道操作模式研究.pptx

    根据名烟名酒店的五种盈利模式(资源盈利模式、区域位势盈利模式、以烟带酒盈利模式、机会性盈利模式和跟风式盈利模式),可看出不同模式下的主推介能力差异,这对制定针对性的分级管理制度至关重要。通过针对核心烟...

    深信服企业级云主推场景及解决方案.pptx

    深信服企业级云主推场景及解决方案.pptx

Global site tag (gtag.js) - Google Analytics