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

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

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

    如鵬網 大學生計算機學習社區(qū)

    CowNew開源團隊

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

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

    Decorate(裝飾者模式)

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

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

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

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

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

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

    FilterInputStream myStream=new LineNumberInputStream

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

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

    下面是我們的類靜態(tài)圖


        我們定義一個接口
    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;

     

      }

    }

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

    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;

    }

    我們甚至可以動態(tài)的添加不同的過濾器,例如對于會員我們要對輸入的留言進行超鏈接修飾并且將他的留言發(fā)送到網管郵箱,而對于非會員我們則要過濾他輸入的敏感詞匯并且保證輸入的字數不少于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;

    }

    posted on 2006-03-12 00:00 CowNew開源團隊 閱讀(1391) 評論(1)  編輯  收藏

    評論

    # re: Decorate(裝飾者模式) 實現留言版詞匯處理 2006-05-23 12:40 吳淦
    不知道AOP與decorate的區(qū)別在哪里?  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 色窝窝亚洲av网| 亚洲综合色一区二区三区| yellow免费网站| 亚洲成a人片在线观看老师| 精品国产亚洲一区二区三区在线观看| 91在线视频免费91| 国产精品亚洲片夜色在线 | 国内精品免费视频精选在线观看| 亚洲国产免费综合| caoporm碰最新免费公开视频| 亚洲精品一级无码鲁丝片| yellow免费网站| 亚洲AV无码一区二区乱孑伦AS| 99精品视频免费在线观看| 亚洲免费视频观看| 午夜一级免费视频| 一级毛片视频免费观看| 国产AV无码专区亚洲精品| 2022久久国产精品免费热麻豆| 亚洲的天堂av无码| 免费毛片网站在线观看| 免费无遮挡无码视频在线观看| 自拍偷自拍亚洲精品情侣| 久久久久久国产精品免费免费男同 | 亚洲国产片在线观看| 毛片a级毛片免费播放下载 | 91嫩草私人成人亚洲影院| 野花高清在线电影观看免费视频 | 日本久久久久亚洲中字幕| 免费A级毛片无码无遮挡内射| 亚洲国产精品无码久久98| 久99精品视频在线观看婷亚洲片国产一区一级在线| 特级毛片爽www免费版| 亚洲成AV人片一区二区密柚| ww在线观视频免费观看| 久久亚洲AV成人无码国产最大| 亚洲中文字幕无码永久在线| 免费看男女下面日出水来| 视频免费1区二区三区| 亚洲精品视频在线| 国产色爽女小说免费看|