posts - 262,  comments - 221,  trackbacks - 0
Informa的core包介绍如下:

“This package contains interfaces for the news channel objects, it builds the core API for all news channel storage implementation. ”

从上面这句话来看,core包里面定义的都是关于“news channel objects”的接口---实际上就是RSS协议中的channel和item元素。经过一个多小时查看源代码和阅读API,发现Informa对core包的设计有如下特点:

core包中的元素被分为标记接口、实体接口、行为接口

A.标记接口

在core包的下面,有一系列以WithXxxMIF命名形式的借口。一开始我搞不懂这是什么设计理念,后来当我查看了另外两个接口后终于明白这样设计的意图了

ChannelIF的接口定义:
public interface ChannelIF extends WithIdMIF, WithTitleMIF, WithElementsAndAttributesMIF, WithLocationMIF, WithCreatorMIF, WithCategoriesMIF, WithDescriptionMIF, WithSiteMIF, ChannelObservableIF

ItemIF的接口定义:
public interface ItemIF extends WithIdMIF, WithTitleMIF, WithElementsAndAttributesMIF, WithCreatorMIF, WithCategoriesMIF, WithDescriptionMIF, 
WithLinkMIF, WithChannelMIF, WithUnreadMIF

可以看到不论是Channel还是Item,他们都继承了一系列的meta/marker-interface。例如:WithIdMIF,WithTitleMIF,WithDescriptionMIF等等。为什么呢?通过翻查RSS 2.0的规范后我终于明白了:

在RSS 2.0规范中,channel和item都有大量命名相同的标记(或者称为子节点也好),如果都为channel和item都定义一套那么显得设计过于冗余了,所以作者的意图应该是:把这些相同的节点抽取出来,作为元节点来定义。这样channel和item就可以共享这些定义了,实现动态的组合。而且设想一下,假设以后协议有变动,改变起来也很容易。这就像搭积木一样。

B.实体接口

既然标记接口是用来表达元数据的标记的,那么实体接口就是这些元标记接口的组合,再加上一些不能共享或独有的元素了。请看core包里面最重要的两个实体接口:ChannelIF和ItemIF。除了继承上面标记接口的元素外,他们分别又根据RSS协议中定义的元素,增加了其他相应元素的定义。

例如在ChannelIF中有addItem,setLanguage之类的特有于Channel的方法定义。而在Item中则有setComments,setSource方法的定义。

在实体接口中有两个需要注意的地方:CategoryIF和ChannelGroupIF。这两个接口都是对Channel的组织形式,仅从定义难以区分它们的不同:

CategoryIF:
public interface CategoryIF extends WithIdMIF, WithTitleMIF, WithChildrenMIF<CategoryIF>

ChannelGroupIF:
public interface ChannelGroupIF extends WithIdMIF, WithTitleMIF, WithChildrenMIF

比较API说明后才有些理解:

CategoryIF

This interface is implemented by objects representing categories in which channels could be organised in the news channel object model.

ChannelGroupIF
Interface to allow to implement a container of channels that may be used by a channel registry (through a front-end) or as the entry point for an application using this library. A ChannelGroupIF object may also reflect the root element of a XML file persisted from the channel object model.

★CategoryIF是逻辑组织形式,就像我们平常操作系统中的目录一样。表明该channel属于哪个(些)目录。
★ChannelGroupIF是容器概念,可以看做是所有Channel的一个容器,甚至在某些情况下可以是代表了一个从持久层获取的XML文档的根节点。表示的是“Channel集”这些对象

除了上面介绍的这几个,还有几个需要提到的:

ItemMetadataIF
这是一个用来描述Item非业务信息的节点,它包含了该item是否已读,还有优先级(可以用于item的排序)等信息

TextInputIF
这是RSS协议中定义的一个用于帮助用户搜索指定关键字的节点,实现者会展现为一个文本输入框来接受用户的输入

UserIF
RSS定义中并没有user的概念,这是Informa用来存储用户定制列表的辅助类,里面定义了add/removeChannelSubscription方法

C.行为接口

在core包中还定义了一系列对Channel进行操作的行为接口,它们多数都是以ChannelXxxIF形式来命名的。包括了

IdGeneratorIF:用来根据不同的策略生成各种ID

ChannelParserIF:用于读入某个指定协议格式的文件,并产生对应的Channel对象
ChannelBuilderIF:允许解析器(Parser)根据需要生成不同格式的Channel,会被Parser调用
ChannelExporterIF:允许根据需要将内存中的Channel导出为不同的形式
ChannelSubscriptionIF:用来决定当Channel源出现更新且阶段更新时间来临时,Channel是否需要更新内容

ChannelObserverIF:用来监听Channel对象上发生的事件并作出相应的反应
ChannelObservableIF:用来通知监听者发生了某个事件



-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-21 22:09 Paul Lin 阅读(1227) 评论(0)  编辑  收藏 所属分类: J2SE

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜