求教一个观察者模式应用的问题

09-12-29 feikiss
    

大家好,我最近初学设计模式,之前写过一个QQ的小软件,对于QQ上、下线提示的处理一直很头疼,最后我通过手动抛异常实现了下线提醒。后来接触了观察者模式后我突然想可以用此模式来实现。我的大致思路如下:服务器作为被观察者,各个客户端作为观察者等待服务器发送相应的消息。但当我实现时我才发现,由于这是基于socket的网络编程,当把服务器作为被观察的对象(this)写入socket后,在客户端读出时就不再是同一个对象了,也就是说客户端无法观察同一个对象实体了,那观察者模式也就无法应用了,针对这一问题,我该如何解决呢?

当然,我并不是为了特意用观察者模式的,只是感觉在此用观察者模式比较合适。还有,我看到的所有观察者模式的例子都是本地程序,难道此模式在牵扯到网络编程的时候就没法使用了么?这是我比较困惑的一点,希望大家能给予一些指点~ ~

    

banq
2009-12-29 16:04

基本思路不错。

这里可以用观察者模式,JMS其实就是这种类型观察者模式,不过它使用topic或Queue屏蔽了Socket传输这些底层实现。

你可以引入Proxy来屏蔽Socket底层实现,在客户端和服务器端各做一个Proxy代理分别代表另外一方。

我把观察者模式总结为事件模式的一种,事件模式实际是事件架构,是一种大模式了。

[该贴被banq于2009-12-29 17:06修改过]

feikiss
2009-12-29 19:49

2009年12月29日 16:04 "banq"的内容
基本思路不错。

这里可以用观察者模式,JMS其实就是这种类型观察者模式,不过它使用topic或Queue屏蔽了Socket传输这些底层实现。

你可以引入Proxy来屏蔽Socket底层实现,在客户端和服务器端各做一个Proxy代理分别代表另外一方。

我把观察者模式总结为事件模式的一种,事件模式实际是事件架构,是一种大模式了。

谢谢banq的回答,您说的Proxy是java.lang.reflect包中的呢还是java.net包中的呢,如果是前者的话,在客户端做代理不就又回到我原来说的问题上了,每个客户端观察的主体不一样,那我最初的目的(观察同一个主体——服务器的实例对象)不是又达不到了么?

banq
2009-12-30 09:28

>您说的Proxy是java.lang.reflect包中的呢还是java.net包中的呢

学习模式,就要分清楚哪些是底层实现,哪些属于设计部分,我们一般谈设计模式,基本就设计这个范围里谈,如果把底层概念(语言平台)拿到设计范围里谈,就象你在谈论中国事情,又扯到美国了。

Proxy是Proxy模式。如果你还不知道如何落实到代码,可以找一些Socket库或开源框架来看看,比如MINA等等。

多看源码是学习设计模式必经之路。