仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 650|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA编程:利用Decorate形式完成留言版辞汇处置

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:13:59 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。  粉饰者形式以对客户端通明的体例静态的为对象增添义务。此形式供应了一个比承继更加天真的替换计划来扩大对象的功效,制止了承继办法发生的类激增成绩,并且更便利变动对象的义务。

  我们常常要为某一些一般的对象增添一些新的职责,并非全体的类。比方我们体系留言反应板块中大概必要过滤用户输出留言中的一些辞汇(比方政治敏感辞汇、色情辞汇等)、还大概对用户输出留言举行一些润色(比方对用户输出的URL主动加上超链接、对用户输出的UBB代码举行转换的)、还大概将用户输出的内容准时发送的网管的邮箱中等等。假如利用类承继的体例举行计划,我们大概要计划一个接口

  BodyContentFilterIntf,然后在由BodyContentFilterIntf派生出SensitiveWordContentFilter、HtmlContentFilter、SendEmailContentFilter等类。可是假如还要请求同时能过滤敏感辞汇并能举行润色、大概过滤敏感辞汇以后把用户输出的留言发送到网管邮箱等等,如许就要增添SensitiveWordHtmlContentFilter、SensitiveWordSendEmaillContentFilter等类,这类体例招致了子类瀑发式的发生。

  一个天真的办法是将过滤器嵌进另外一个过滤器中,由这个过滤器来卖力挪用被嵌进过滤器的办法并实行本人的过滤器办法。我们称这个嵌进的过滤器为粉饰(Decorator)。这个粉饰与过滤器接口分歧。粉饰将哀求向前转到到另外一个过滤器,而且大概能转发前后实行一些分外的举措(如润色、发送邮件),通明性使你能够递回的嵌套多个粉饰,从面能够增加恣意多的功效。

  实在java中的过滤器形式使用十分多,典范的就是IO的Stream操纵。在IO处置中,Java将数据笼统为流(Stream)。在IO库中,最基础的是InputStream和OutputStream两个分离处置输入和输出的对象,可是在InputStream和OutputStream中之供应了最复杂的流处置办法,只能读进/写出字符,没有缓冲处置,没法处置文件,等等。

  LineNumberInputStream、BufferInputStream、StringBufferInputStream等供应各类分歧服务的类只需组合起来就能够完成良多功效,以下:

FilterInputStreammyStream=newLineNumberInputStream
(newBufferInputStream(newStringBufferInputStream(myStringBuffer)));
  多个的Decorator被层叠在一同,最初失掉一个功效壮大的流。既可以被缓冲,又可以失掉行数,这就是Decorator的能力!

  上面是我们的类静态图





  我们界说一个接口BodyContentFilterIntf来界说一切过滤器要完成的办法:

publicinterfaceBodyContentFilterIntf{
 publicStringfiltContent(StringaContent)throwsContentFilterException;
}
  这个接口中只要一个办法filtContent,将要过滤的留言传给aContent参数,filtContent对aContent举行一些处置(如粉饰URL、UBB等),然后将处置后的字符串做为前往值前往;假如留言没有经由过程过滤(如含有敏感辞汇等),只需抛出自界说ContentFilterException非常便可。

  上面是一个大概的一个过滤器(包管输出的字数多于50):

publicclassLengthContentFilter

implementsBodyContentFilterIntf{
 privateBodyContentFilterIntfbodyContentFilterIntf=null;
 publicHtmlContentFilter(BodyContentFilterIntfaFilter)
 {
  bodyContentFilterIntf=aFilter;
 }

 publicStringfiltContent(StringaContent)throwsContentFilterException{
  Stringl_Content=aContent;
  If(bodyContentFilterIntf!=null)
   _Content=bodyContentFilterIntf.filtContent(l_Content);
  if(aContent.length()<=50)
   thrownewContentFilterException(“输出的字数不克不及少于50!”);
    returnaContext;
 }
}
  这是另外一个过滤器(伪码,用来完成向网管邮箱发送邮件)publicclassSendEmailContentFilter

implementsBodyContentFilterIntf{
 privateBodyContentFilterIntfbodyContentFilterIntf=null;
 publicSendEmailContentFilter(BodyContentFilterIntfaFilter)
 {
  bodyContentFilterIntf=aFilter;
 }

 publicStringfiltContent(StringaContent)throwsContentFilterException{
  Stringl_Content=aContent;
  if(bodyContentFilterIntf!=null)
   l_Content=bodyContentFilterIntf.filtContent(l_Content);
   SendEmail(“webmaster@SnailWeb.com”,l_Content)
  returnaContext;
 }
}
  固然另有SensitiveWordContextFilter(过滤敏感辞汇),HtmlContentFilter(润色用户输出留言中的超等链接)等。

  有了这些过滤器,我们就能够很便利的为留言版增加各类复合的过滤器。比方我们想对输出的留言举行超链接润色和过滤敏感辞汇,那末我们只需以下挪用便可:

try{
 l_Content=newHtmlContentFilter(newSensitiveWordContextFilter(null)).
 filtContent(bodyContext);
}

catch(ContentFilterExceptionex){
 BBSCommon.showMsgInResponse(response,ex.getMessage());
 return;
}
  我们乃至能够静态的增加分歧的过滤器,比方关于会员我们要对输出的留言举行超链接润色而且将他的留言发送到网管邮箱,而关于非会员我们则要过滤他输出的敏感辞汇而且包管输出的字数很多于50,我们只需以下挪用便可:

try{
 BodyContentFilterIntfbodyContentFilterIntf=null;
 bodyContentFilterIntf=newHtmlContentFilter(null);
 if(IsMember==true)
  bodyContentFilterIntf=newsendEmailContentFilter(bodyContentFilterIntf);
 else
  bodyContentFilterIntf=newSensitiveWordContextFilter(bodyContentFilterIntf);
 l_Content=bodyContentFilterIntf.filtContent(bodyContext);
}
catch(ContentFilterExceptionex){
 BBSCommon.showMsgInResponse(response,ex.getMessage());
 return;
}
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-4 05:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表