Jive源代码研究(3)

作者在 2006-11-18 18:48:00 发布以下内容

Decorator模式和过滤器
 
  一般的在OO设计中,而外功能的添加是通过继承来实现的,但是继承有的时候不够灵活,而且当功能的组合很多的时候,继承的子类就会成几何级数增长,使得类多的难以控制。正是基于这样的考虑,Decorator模式得以诞生。

  Decorator模式相当于封装了某个特定的操作,当某个对象需要这个操作的时候,加上这个Decorator即可。并且,多个Decorator还可以组合,以提供更多的功能。

  在Jive中,Decorator模式应用在一些过滤器(Filter)中。Filter提供对ForumMessage对象内容的重新构造。比如,当一个ForumMessage对象流过一个名为FilterCodeHighlight的过滤器后,存在于消息中的所有Java源代码文本,会被重新构造为具有语法高亮显示的消息。在比如,当经过了语法高亮修饰的消息再流过一个名为FilterHtml的过滤器后,消息中的HTML片断会被注释可以在HTML内部显示文本,这样就防止了用户输入了HTML控制标签后,使得页面显示不正常的问题。

  Jive中,所有的过滤器继承于一个抽象类ForumMessageFilter,而ForumMessageFilter又实现了ForumMessage接口。也就是说,每一个过滤器实际上也是一个ForumMessage对象。

  ForumMessageFilter中还封装一个ForumMessage对象。进行过滤的方法很简单,使用的是getBody(),比如在FilterCodeHighlight这个类中:

public String getBody() {
return highlightCode(message.getBody());
}

 

  highlightCode是一个private方法,实施具体的过滤的细节。getBody()方法实际上是定义在ForumMessage接口中的,当调用过滤器的getBody()方法时,就能够得到结构重整后的ForumMessage对象了。这个对象可以被其他客户引用,也可以在传递给另外的过滤器,实施进一步的操作。

  在实现一个具体的消息的过滤的时候,在Forum中有addForumMessageFilter(),applyFilters()方法,用来实现对过滤器的应用。

  对一个Forum,使用addForumMessageFilter()方法添加一个Filter的时候,并没有指定一个具体的Message,而只是一个规则(Filter中封装了过滤规则),然后applyFilter()方法中,实施这些规则:

public ForumMessage applyFilters(ForumMessage message) {
//Loop through filters and apply them
for (int i=0; i < filters.length; i++) {
message = filters.clone(message);
}
return message;
}

 

  过滤器的clone()方法,为过滤器复制消息体。这个方法的使用,分离了在过滤器中对于消息体和过滤规则的初始化过程,这也是一个值得借鉴的技巧!

  下面给出Decorator模式的类图:

 

图4:Decorator模式的类图

 

  我们可以看到Decorator模式实际上和Proxy模式是很相近的,但是它们代表两个不同的功能含义。Proxy模式提供一个对象的控制,而Decorator模式则是为对象提供额外的功能。

java | 阅读 898 次
文章评论,共0条
游客请输入验证码