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

來源:互聯網
上載者:User
  裝飾者模式以對用戶端透明的方式動態為對象增加責任。此模式提供了一個比繼承更為靈活的替代方案來擴充項物件的功能,避免了繼承方法產生的類激增問題,而且更方便更改對象的責任。

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

  BodyContentFilterIntf,然後在由BodyContentFilterIntf派生出SensitiveWordContentFilter、HtmlContentFilter、SendEmailContentFilter等類。但是如果還要要求同時能過濾禁用語並能進行修飾、或者過濾禁用語之後把使用者輸入的留言發送到網管郵箱等等,這樣就要增加SensitiveWordHtmlContentFilter、SensitiveWordSendEmaillContentFilter等類,這種方式導致了子類瀑髮式的產生。

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

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

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

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進行一些處理(如裝飾URL、UBB等),然後將處理後的字串做為傳回值返回;如果留言沒有通過過濾(如含有禁用語等),只要拋出自訂ContentFilterException異常即可。

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

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 (aContent.length()<=50)
   throw new ContentFilterException (“輸入的字數不能少於50!”);
    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(“webmaster@SnailWeb.com”,l_Content)
  return aContext;
 }
}
  當然還有SensitiveWordContextFilter(過濾禁用語),HtmlContentFilter(修飾使用者輸入留言中的超級連結)等。

  有了這些過濾器,我們就可以很方便的為留言版添加各種複合的過濾器。例如我們想對輸入的留言進行超連結修飾和過濾禁用語,那麼我們只要如下調用即可:

try {
 l_Content = new HtmlContentFilter(new SensitiveWordContextFilter(null)).
 filtContent(bodyContext);
}

catch (ContentFilterException ex) {
 BBSCommon.showMsgInResponse(response, ex.getMessage());
 return;
}
  我們甚至可以動態添加不同的過濾器,例如對於會員我們要對輸入的留言進行超連結修飾並且將他的留言發送到網管郵箱,而對於非會員我們則要過濾他輸入的禁用語並且保證輸入的字數不少於50,我們只要如下調用即可:

try {
 BodyContentFilterIntf bodyContentFilterIntf = null;
 bodyContentFilterIntf = new HtmlContentFilter(null);
 if(IsMember==true)
  bodyContentFilterIntf = new sendEmailContentFilter(bodyContentFilterIntf);
 else
  bodyContentFilterIntf = new SensitiveWordContextFilter(bodyContentFilterIntf);
 l_Content = bodyContentFilterIntf.filtContent(bodyContext);
}
catch (ContentFilterException ex) {
 BBSCommon.showMsgInResponse(response, ex.getMessage());
 return;
}

相關關鍵詞:
相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。