做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);
}
}
分享到:
相关推荐
"index"通常代表最新或主推的版本,而"old"可能包含之前的版本或者备用主题。开发者可以根据项目需求选择合适的样式,或者自定义编辑器的主题以适应网站的整体设计。 使用富文本编辑器时,开发者需要在服务器端集成...
3. **用户行为研究**:分析用户评价和反馈,了解消费者需求,改进产品设计和服务。 4. **营销策略制定**:根据点击率和转化率,优化广告投放和促销活动。 5. **预测模型构建**:利用历史数据预测未来销售,为库存...
以下是如何设定促销政策以促进客户主推自己产品的详细说明: 1. **制定具有竞争力的促销力度**:在关键销售时期,产品的促销力度直接影响其市场地位。厂家需要通过调研了解竞争对手的政策,确保自己的促销力度更大...
主推款跟踪表.xls
总结来说,Remobjects SDK的EventSink机制为C#开发者提供了一种高效、灵活的方式来实现服务器主推数据到客户端的功能,减少了不必要的网络通信和提高了应用的响应速度。通过理解和应用这种模式,开发者能够构建出...
7. 客流量变化:整体客流量下降,各政策商品的客流量在重新分配,主推商品的终端拦截能力强,但影响了消费者的购药积极性。 8. 提高顾客满意度的策略: - 尊重顾客选择,对指名购买的品牌药不要强行拦截。 - 培养...
OBJECTIVE-C编程之道 ...即便现在苹果公司主推swift,设计模式无关乎语言,掌握了使用哪种语言实现就不重要了。之所以推荐这本书和源代码,因为有完整的例子,一般讲解设计模式的都是零散的例子。 本书也提供了下载。
5. **政务云**:政府机构可能需要建立PPP模式的政务云,以提升公共服务效率并确保数据安全。 【产品替换类场景的销售话术】 在产品替换类场景中,销售策略应强调新云平台的优越性,如更高的性能、更便捷的管理以及...
订货会主推产品资料.pptx
本项目“springboot-thymeleaf-tiles-demo”旨在演示如何将SpringBoot 1.2.0、Thymeleaf 2.x和Tiles 2.2.2这三者有效地整合在一起,为开发者提供一套完整的MVC解决方案。 首先,SpringBoot是基于Spring框架的一个轻...
"主推商品、新品测试监控表"这个压缩包文件,显然与商品管理和市场推广息息相关。这个文件可能包含了一个详细的表格,用于跟踪和分析主推商品以及新品的测试效果和市场反应。下面,我们将深入探讨相关知识点。 首先...
县农业生产主推技术教材.doc
【龙泉市农业主导品种主推技术】 文档"龙泉市农业主导品种主推技术.doc"主要涵盖了龙泉市在2010年农业领域的主导品种及主推技术,旨在提高农业生产效率和农产品质量。以下是对其中主要农作物品种和技术的详细介绍:...
### 手机主流14年主推平台分析 在2014年的手机市场中,各大芯片厂商纷纷推出了自己的主打平台和技术,以满足不断增长的移动互联网需求。本篇文章将根据给定的信息,对2014年主流的手机芯片平台进行详细分析,包括...
企业级云主推场景及解决方案.pptx
在分析国外运营商在4G商用初期主推业务时,我们可以看到多个关键知识点的展现。其中,高速、智能和云服务作为核心要素,是4G业务推广和发展的关键方向。 首先,关于“高速”,4G网络的高速特性是其区别于之前3G网络...
根据名烟名酒店的五种盈利模式(资源盈利模式、区域位势盈利模式、以烟带酒盈利模式、机会性盈利模式和跟风式盈利模式),可看出不同模式下的主推介能力差异,这对制定针对性的分级管理制度至关重要。通过针对核心烟...
深信服企业级云主推场景及解决方案.pptx