<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的區別在哪里?  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 免费国产99久久久香蕉| 香蕉免费看一区二区三区| 2019中文字幕免费电影在线播放 | 人妻18毛片a级毛片免费看| 深夜福利在线视频免费| 又粗又硬又黄又爽的免费视频 | 亚洲国产人成精品| 国产美女无遮挡免费网站| 亚洲国产成人爱av在线播放| 国产精品亚洲专一区二区三区| 国产福利免费观看| 日韩久久无码免费毛片软件| 亚洲国产精品一区二区三区久久| 日韩成人毛片高清视频免费看| 国产亚洲精品成人a v小说| 国产精品偷伦视频观看免费| 亚洲色欲色欲综合网站| av无码免费一区二区三区| 亚洲中文字幕久久精品蜜桃| 国产精品视频免费一区二区| 在线观看亚洲专区| 亚洲日产韩国一二三四区| 亚洲1区2区3区精华液| 亚洲精品乱码久久久久久不卡| 99在线免费视频| 亚洲日韩VA无码中文字幕| 久99久无码精品视频免费播放| 久久精品国产亚洲| 久久精品免费一区二区喷潮| 337p日本欧洲亚洲大胆人人| 国产成人精品亚洲精品| 免费视频成人片在线观看| 亚洲无人区码一二三码区别图片 | 美女免费视频一区二区| 亚洲乱码精品久久久久..| 国产亚洲综合久久| 亚洲精品你懂的在线观看| 一个人在线观看视频免费| 国产精品免费久久| 亚洲制服在线观看| 国产亚洲精品成人a v小说|