如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請聯(lián)系 about521 at 163.com

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

          Decorate(裝飾者模式)

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

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

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

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

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

          LineNumberInputStreamBufferInputStreamStringBufferInputStream等提供各種不同服務(wù)的類只要組合起來就可以實(shí)現(xiàn)很多功能,如下:

          FilterInputStream myStream=new LineNumberInputStream

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

          多個(gè)的Decorator被層疊在一起,最后得到一個(gè)功能強(qiáng)大的流。既能夠被緩沖,又能夠得到行數(shù),這就是Decorator的威力!

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


              我們定義一個(gè)接口
          BodyContentFilterIntf 來定義所有過濾器要實(shí)現(xiàn)的方法:

          public interface BodyContentFilterIntf {

            public String filtContent(String aContent) throws ContentFilterException;

          }

          這個(gè)接口中只有一個(gè)方法filtContent,將要過濾的留言傳給aContent參數(shù),filtContent對aContent進(jìn)行一些處理(如裝飾URL、UBB等),然后將處理后的字符串做為返回值返回;如果留言沒有通過過濾(如含有敏感詞匯等),只要拋出自定義ContentFilterException異常即可。

          下面是一個(gè)可能的一個(gè)過濾器(保證輸入的字?jǐn)?shù)多于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 (輸入的字?jǐn)?shù)不能少于50!);

              return aContext;

           

            }

          }

          這是另一個(gè)過濾器偽碼用來實(shí)現(xiàn)向網(wǎng)管郵箱發(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;

            }

          }

          當(dāng)然還有SensitiveWordContextFilter(過濾敏感詞匯),HtmlContentFilter(修飾用戶輸入留言中的超級鏈接等。

          有了這些過濾器,我們就可以很方便的為留言版添加各種復(fù)合的過濾器。例如我們想對輸入的留言進(jìn)行超鏈接修飾和過濾敏感詞匯,那么我們只要如下調(diào)用即可:

          try {

                    l_Content = new HtmlContentFilter(new SensitiveWordContextFilter(null)).

                    filtContent(bodyContext);

              }

              catch (ContentFilterException ex) {

                BBSCommon.showMsgInResponse(response, ex.getMessage());

                return;

          }

          我們甚至可以動態(tài)的添加不同的過濾器,例如對于會員我們要對輸入的留言進(jìn)行超鏈接修飾并且將他的留言發(fā)送到網(wǎng)管郵箱,而對于非會員我們則要過濾他輸入的敏感詞匯并且保證輸入的字?jǐn)?shù)不少于50,我們只要如下調(diào)用即可:

          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開源團(tuán)隊(duì) 閱讀(1394) 評論(1)  編輯  收藏

          評論

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 巴里| 合水县| 衡山县| 普兰县| 防城港市| 邓州市| 三原县| 务川| 大化| 天水市| 深水埗区| 白城市| 永安市| 巴林右旗| 太保市| 额敏县| 石首市| 滕州市| 探索| 巴林右旗| 亚东县| 太湖县| 神木县| 东阳市| 昌吉市| 肥西县| 贞丰县| 牡丹江市| 河西区| 信丰县| 沐川县| 闻喜县| 大悟县| 陇南市| 临洮县| 青海省| 白朗县| 泾川县| 拉萨市| 舟曲县| 隆昌县|