<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派生出SensitiveWordContentFilterHtmlContentFilterSendEmailContentFilter等類。但是如果還要要求同時能過濾敏感詞匯并能進行修飾、或者過濾敏感詞匯之后把用戶輸入的留言發送到網管郵箱等等,這樣就要增加SensitiveWordHtmlContentFilterSensitiveWordSendEmaillContentFilter等類,這種方式導致了子類瀑發式的產生。

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

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

    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進行一些處理(如裝飾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;

    }

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

    評論

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


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


    網站導航:
     
    主站蜘蛛池模板: 无码精品人妻一区二区三区免费| 午夜私人影院免费体验区| 2015日韩永久免费视频播放| 中文字幕不卡亚洲| 特a级免费高清黄色片 | 亚洲色欲啪啪久久WWW综合网| 精品国产sm捆绑最大网免费站| 亚洲精品午夜视频| 四虎1515hh永久久免费| 亚洲人成人77777在线播放 | 四虎国产精品免费久久| 亚洲欧洲日本在线观看| 日韩人妻无码免费视频一区二区三区| 亚洲一区电影在线观看| 最新69国产成人精品免费视频动漫| 亚洲国产区男人本色| 日韩精品亚洲专区在线观看| 青青久久精品国产免费看| 亚洲午夜国产精品无码老牛影视 | 一级片在线免费看| 免费av欧美国产在钱| 亚洲av片劲爆在线观看| 91久久精品国产免费直播| 亚洲欧美成人综合久久久| 91精品手机国产免费| 亚洲色图激情文学| 亚洲福利视频一区二区| 波多野结衣免费一区视频| 亚洲一区二区久久| 免费永久国产在线视频| 四虎国产精品免费永久在线| 亚洲尹人九九大色香蕉网站| 中文字幕av免费专区| 久久久久无码专区亚洲av| 毛片无码免费无码播放| 涩涩色中文综合亚洲| 国内精品99亚洲免费高清| 久艹视频在线免费观看| 亚洲熟妇久久精品| 亚洲AV无码一区二区二三区软件| 成人毛片免费在线观看|