熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

使用Decorate模式實現留言版詞匯處理

2013-11-23 19:47:42  來源: Java高級技術 

  裝飾者模式以對客戶端透明的方式動態的為對象增加責任此模式提供了一個比繼承更為靈活的替代方案來擴展對象的功能避免了繼承方法產生的類激增問題而且更方便更改對象的責任

  我們經常要為某一些個別的對象增加一些新的職責並不是全部的類例如我們系統留言反饋板塊中可能需要過濾用戶輸入留言中的一些詞匯(例如政治敏感詞 匯色情詞匯等)還可能對用戶輸入留言進行一些修飾(例如對用戶輸入的URL自動加上超鏈接對用戶輸入的UBB代碼進行轉換的)還可能將用戶輸入的 內容定時發送的網管的郵箱中等等如果使用類繼承的方式進行設計我們可能要設計一個接口

  BodyContentFilterIntf然後在由BodyContentFilterIntf派生出 SensitiveWordContentFilterHtmlContentFilterSendEmailContentFilter等類但是 如果還要要求同時能過濾敏感詞匯並能進行修飾或者過濾敏感詞匯之後把用戶輸入的留言發送到網管郵箱等等這樣就要增加 SensitiveWordHtmlContentFilterSensitiveWordSendEmaillContentFilter等類這種 方式導致了子類瀑發式的產生

  一個靈活的方法是將過濾器嵌入另一個過濾器中由這個過濾器來負責調用被嵌入過濾器的方法並執行自己的 過濾器方法我們稱這個嵌入的過濾器為裝飾(Decorator)這個裝飾與過濾器接口一致裝飾將請求向前轉到到另一個過濾器並且可能能轉發前後執 行一些額外的動作(如修飾發送郵件)透明性使你可以遞歸的嵌套多個裝飾從面可以添加任意多的功能

  其實java中 的過濾器模式應用非常多典型的就是IO的Stream操作在IO處理中Java將數據抽象為流(Stream)在IO庫中最基本的是 InputStream和OutputStream兩個分別處理輸出和輸入的對象但是在InputStream和OutputStream中之提供了最 簡單的流處理方法只能讀入/寫出字符沒有緩沖處理無法處理文件等等

  LineNumberInputStreamBufferInputStreamStringBufferInputStream等提供各種不同服務的類只要組合起來就可以實現很多功能如下

  FilterInputStream myStream=new LineNumberInputStream

  ( new BufferInputStream( new StringBufferInputStream( myStringBuffer)));

  多個的Decorator被層疊在一起最後得到一個功能強大的流既能夠被緩沖又能夠得到行數這就是Decorator的威力!

  我們定義一個接口BodyContentFilterIntf 來定義所有過濾器要實現的方法

  public interface BodyContentFilterIntf {

  public String filtContent(String aContent) throws ContentFilterException;

  }

  這個接口中只有一個方法filtContent將要過濾的留言傳給aContent參數filtContent對aContent進行一些處理(如 裝飾URLUBB等)然後將處理後的字符串做為返回值返回如果留言沒有通過過濾(如含有敏感詞匯等)只要拋出自定義 ContentFilterException異常即可

  下面是一個可能的一個過濾器(保證輸入的字數多於

  public class LengthContentFilter

  implements BodyContentFilterIntf {

  private BodyContentFilterIntf bodyContentFilterIntf = null;

  public HtmlContentFilter(BodyContentFilterIntf aFilter)

  {

  bodyContentFilterIntf = aFilter;

  }

  public String filtContent(String aContent) throws ContentFilterException {

  String l_Content = aContent;

  If (bodyContentFilterIntf!=null)

  _Content = bodyContentFilterIntf filtContent(l_Content);

  if (aContentlength()<=)

  throw new ContentFilterException (輸入的字數不能少於);

  return aContext;

  }

  }

  這是另一個過濾器(偽碼用來實現向網管郵箱發送郵件) public class SendEmailContentFilter

  implements BodyContentFilterIntf {

  private BodyContentFilterIntf bodyContentFilterIntf = null;

  public SendEmailContentFilter(BodyContentFilterIntf aFilter)

  {

  bodyContentFilterIntf = aFilter;

  }

  public String filtContent(String aContent) throws ContentFilterException {

  String l_Content = aContent;

  if (bodyContentFilterIntf!=null)

  l_Content = bodyContentFilterIntf filtContent(l_Content);

  SendEmail(wel_Content)

  return aContext;

  }

  }

  當然還有SensitiveWordContextFilter(過濾敏感詞匯)HtmlContentFilter(修飾用戶輸入留言中的超級鏈接)等

  有了這些過濾器我們就可以很方便的為留言版添加各種復合的過濾器例如我們想對輸入的留言進行超鏈接修飾和過濾敏感詞匯那麼我們只要如下調用即可

  try {

  l_Content = new HtmlContentFilter(new SensitiveWordContextFilter(null))

  filtContent(bodyContext);

  }

  catch (ContentFilterException ex) {

  BBSCommonshowMsgInResponse(response exgetMessage());

  return;

  }

  我們甚至可以動態的添加不同的過濾器例如對於會員我們要對輸入的留言進行超鏈接修飾並且將他的留言發送到網管郵箱而對於非會員我們則要過濾他輸入的敏感詞匯並且保證輸入的字數不少於我們只要如下調用即可

  try {

  BodyContentFilterIntf bodyContentFilterIntf = null;

  bodyContentFilterIntf = new HtmlContentFilter(null);

  if(IsMember==true)

  bodyContentFilterIntf = new sendEmailContentFilter(bodyContentFilterIntf);

  else

  bodyContentFilterIntf = new SensitiveWordContextFilter(bodyContentFilterIntf);

  l_Content = bodyContentFilterIntffiltContent(bodyContext);

  }

  catch (ContentFilterException ex) {

  BBSCommonshowMsgInResponse(response exgetMessage());

  return;

  }


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27457.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.