“异构信息的聚合”我的实现方法

有时候,我们需要将一些不同类型、结构的信息聚合在一起,提供给用户。

 

举例:QQ空间中的好友动态,将日志、说说、签名档、相册相片等信息聚合在一起向用户展示。类似还有微博、轻博客等。谁叫我是一只菜鸟,因此不知道具体实现方案。如果您知道,请鄙视我吧,鄙视完后请告诉我方法,谢谢。

 

问题:项目中有一空间应用中需要类似好友动态功能。主题类型由两部分组成,一是日志、说说、相片相册,其二是创建、评论、回复,于是这两种主题类型的组合成的主题角色有:日志创建、日志评论、日志评论的回复、说说创建、说说评论、说说评论的回复、相册相片创建、相册相片评论、相册评论的回复。这些信息都可能需要按时间先后顺序聚合显示。

 

网络搜索问题解决方案一:通过log来实现。记录每一个用户的每一个功能点操作,写入log,展示时则显示相关好友的log,按时间先后排序。方案二:直接查询功能表(日志、相册等),再在程式中处理。总结分析:方案一,例如在日志创建、修改过程中,会将所有的信息均记录在log中,而用户其实感兴趣的是最终修改后的效果,另外,长长的log记录,最后还得通过水平分表等方案去解决单表记录过多、查询效率等问题。方案二未给出具体实施方案,如果程式中只作简单实现处理,未作特别设计,可维护性和扩展性差。

 

在作选择时,因希望提供实时信息,故将网络方案一排除。好吧,我承认这个借口有些勉强。总之是觉得它不爽就是了,故而有下文。

 

我的选择一:单独区分各功能点的好友动态。即:将日志、相册、评论、回复等动态区分开来,单独查询,没什么需要特殊说明的。在应用中实现了部分功能,但最终选择放弃,原因很简单,这实际上已经没有了所谓的信息聚合了。

 

我的选择二:采用网络方案二。并最终完成。当然是通过一些所谓特别的设计,否则就没下文了。

 

有了选择,但我可不想把一堆乱糟糟的查询和重新排序之类的代码堆积在一起。我需要的效果是:在查询时,像我的选择一中那样,各自查询,然后以统一的方式进行聚合,然后再将聚合的内容以各自的方式显示。

 

各自查询统一聚合,这让我想起了观察者模式,但又有点不同。观察者模式中,如果被观察者发生了什么状况,则轮询告知它的每个观察者。现在,有点不同的是,需要被观察者收集每个观察者的情况,当然,可以在观察者的update方法中返回该信息,然后在被观察者中的notifyObservers方法中进行处理。但我发现,在spring这玩意儿中,一切似乎变得简单了。

 

具体方式:

每个需要进行聚合的主题角色在各自的ServiceImpl中各自进行的查询(当然通过Dao),这些ServiceImpl都实现同一个Service接口,然后将各自的ServiceImpl加入到同一个Action中的一个Service[]数组中,这个Action负责从Service[]中获取聚合的信息并对信息进行重新排序。总体思路就是这样。在信息聚合时,需要一个统一的VO(三个属性:Object objectModel主题角色,String actionName可理解为需要显示的模板或页面路径,Date sortTime用于排序的时间,实质上是存在于objectModel中的其中一个属性),即在每个service中,对各自的主题角色进行封装,封装成VO列表,然后返回。

 在页面中,迭代显示VO,根据VO的actionName加载各自的模板或页面。

 

如果需要将一个新的主题角色加入到聚合列表,只需编写一个Service接口实现(在该实现中进行查询,然后将结果列表封装为VO列表,在spring配置文件中注入actionName的值),然后编写用于显示该主题角色的模板或页面,最后将Service的实现加入Action中的那个Service[]数组中。如下(InfoTalkDiscussServiceImpl即为该Service接口实现):

 

<bean name="infoTalkDiscussService" class="cn.com...service.impl.info.InfoTalkDiscussServiceImpl">
	<property name="talkDiscussDao" ref="talkDiscussDao"></property>
	<property name="actionName"><value>showInfoTalkDiscuss.jsp</value></property>
	</bean>

 

<bean name="infoAction" class="cn.com....action.InfoAction" scope="prototype">
	<property name="infoModelServices">
	   <list>
	     <ref bean="infoTalkDiscussService"/>
	     <ref bean="infoTalkDisReplyService"/>
	     <ref bean="infoDailyDiscussService"/>
	     <ref bean="infoDailyDisReplyService"/>
	   </list>
	</property>
	</bean>

 

效果图如下:


“异构信息的聚合”我的实现方法_第1张图片
 

 

 

 

你可能感兴趣的:(微博,聚合,QQ空间,轻博客,好友动态)