<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    Decorate( 裝飾者模式 )

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

    我們經常要為某一些個別的對象增加一些新的職責,并不是全部的類。例如我們系統留言反饋板塊中可能需要過濾用戶輸入留言中的一些詞匯(例如政治敏感詞匯、色情詞匯等)、還可能對用戶輸入留言進行一些修飾(例如對用戶輸入的 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;

    }

    關于其他的設計模式的使用我在后續文章會繼續介紹,給大家推薦一個網站 http://www.cownew.com?,是個勵志類的,不錯,看到它的介紹很好,很多文章是從天涯搞下來的。

    posted on 2006-03-26 01:46 CowNew開源團隊 閱讀(958) 評論(1)  編輯  收藏

    評論

    # re: Decorate(裝飾者模式) 實現留言反饋板文本處理 2006-03-27 09:46 luckyrobbie
    好方法,謝謝分享  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲黄色片在线观看| 亚洲国产一区二区三区青草影视| 亚洲AV无码一区二区三区牛牛| 日本中文字幕免费高清视频| 亚洲国产精品成人精品无码区| 国产美女视频免费观看的网站| 国产亚洲一区二区三区在线不卡 | 国产V亚洲V天堂无码久久久| 一级做a爰片久久毛片免费看| 亚洲欧洲一区二区三区| 久久高潮一级毛片免费| 亚洲熟妇无码另类久久久| 日本免费久久久久久久网站| 亚洲精品私拍国产福利在线| 中文字幕免费在线观看| 国产成人精品日本亚洲网址| 最近中文字幕无吗高清免费视频| 精品亚洲av无码一区二区柚蜜| 亚洲综合色成在线播放| 免费国产午夜高清在线视频| 亚洲国产成人综合| 国产精品无码一区二区三区免费| 日日狠狠久久偷偷色综合免费| 人人狠狠综合久久亚洲88| 天天影视色香欲综合免费| 亚洲精品无码你懂的| 精品国产亚洲一区二区在线观看| 日韩精品内射视频免费观看| 亚洲一区二区无码偷拍| 亚洲色偷拍区另类无码专区| 久久国产免费观看精品3| 亚洲人成网亚洲欧洲无码| 久久久精品国产亚洲成人满18免费网站 | 亚洲第一精品电影网| 国产美女a做受大片免费| 野花香在线视频免费观看大全 | 自拍偷自拍亚洲精品偷一| 亚洲AV中文无码字幕色三| 女人18毛片a级毛片免费视频| 二个人看的www免费视频| 国产日本亚洲一区二区三区|