观察者模式,主推消息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);
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,我们可以使用`websocket`模块来接收WebSocket主推的字段。 下面是一个简单的示例,演示如何使用Python接收WebSocket主推的字段: ```python import websocket def on_message(ws, message): print(message) def on_error(ws, error): print(error) def on_close(ws): print("WebSocket closed") def on_open(ws): print("WebSocket opened") if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://localhost:8080/ws", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever() ``` 在这个示例中,我们通过`websocket.WebSocketApp`创建一个WebSocket客户端,并注册了`on_message`、`on_error`、`on_close`和`on_open`等回调函数。 在`on_message`回调函数中,我们可以处理WebSocket主推消息。在这个示例中,我们直接将消息打印出来。 在`on_error`回调函数中,我们可以处理WebSocket连接出现错误的情况。在这个示例中,我们直接将错误信息打印出来。 在`on_close`回调函数中,我们可以处理WebSocket连接关闭的情况。在这个示例中,我们直接将关闭消息打印出来。 在`on_open`回调函数中,我们可以处理WebSocket连接建立成功的情况。在这个示例中,我们直接将建立成功的消息打印出来。 最后,我们调用`ws.run_forever()`来启动WebSocket客户端,开始接收WebSocket主推的字段。 需要注意的是,在实际应用中,我们需要根据具体的业务需求来处理WebSocket主推的字段,这里只是一个简单的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值