直掛云帆濟(jì)滄海,展翅遨翔登九天!

          我要飛得更高...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            19 隨筆 :: 0 文章 :: 5 評論 :: 0 Trackbacks
                  從這一階段開始講述軟件設(shè)計模式,我也不再講GoF的神奇歷史,直接進(jìn)入正題。在進(jìn)行模式講解的同時,對于本人來說,一方面也是進(jìn)行了復(fù)習(xí),另一方面也是通過講解使自己對這些模式的使用上達(dá)到一個更加理解的層次。搞軟件的朋友都知道,在進(jìn)行開發(fā)過一段時間后,會發(fā)現(xiàn)自己大學(xué)里學(xué)習(xí)的基礎(chǔ)課很重要。而目前很多朋友對軟件的理解都非常膚淺,只知道增刪改查,試用這樣的程序員能存活多久,思考很重要,學(xué)習(xí)很重要,理解很重要,領(lǐng)悟更重要。讓浮燥的程序員回歸理性吧,模式可能讓浮燥的心情得到凈化,在模式中進(jìn)行思考,在模式中進(jìn)行領(lǐng)悟吧。
                  第一講是裝飾器。當(dāng)初我在學(xué)裝飾器模式的時候總是感覺似懂非懂,一直沒有真正理解。其實裝飾器也叫油漆工模式,再加上在我們的java類庫中有很多是實現(xiàn)了裝飾器模式的類。比方說:在讀取文件時
          FileReader fr = new FileReader(filename);
          BufferedReader br = new BufferedReader(fr);
          這其實就是一個decorator模式。因為針對File的讀取方式有很多,如果每種都要采用繼承的方法,那么會產(chǎn)生很多的子類,那樣顯然是很煩的。
                    裝飾器也稱為油漆工模式。它的目的就是給一個對象動態(tài)地添加一些功能。就像是給對象刷了一層漆,使這個對象更加豐富,而不是通過繼承來增加功能。而這些功能的添加是動態(tài)的運行期的,當(dāng)然這里的動態(tài)并不是像aop中的引介introductor,大家不要混淆。
                    在我們的項目中,經(jīng)常會遇到日志的情況。大凡我們會定義一個log接口就像下面。
          public interface Logger {
              public void log(String msg);
          }
          一般我們會把日志保存中文件中,所以有了一個FileLogger

          public class FileLogger implements Logger {

           public void log(String msg) {
                  //開始記錄日志到文件中
           }
          }
          此時如果在項目有些地方需要對日志進(jìn)行加密,有些地方又不需要加密,或者有些地方生成的文件是以xml的方式。此時如果采用繼承的方法,也能實現(xiàn),但是從面向?qū)ο蟮慕嵌葋碚f,并不建議對象的層次太深,增加系統(tǒng)的復(fù)雜性,這樣對于系統(tǒng)的擴(kuò)展和維護(hù)都不是很方便。此時Decorator模式就可以幫我們解決這些問題,我們可以為這個一般的FileLogger對象上刷一層不同的漆,那么這些漆,從上面增加的功能角度來說,就是加了一個“加密”的漆,或加了一層“生成xml”的漆。
          先定義一個Decorator接口,此接口也實現(xiàn)了Logger接口
          public class LoggerDecorator implements Logger{
             Logger logger;
             public LoggerDecorator(Logger logger){
                  this.logger=logger;
             }
             //開始記錄日志
             public void log(String msg){
                 //此處便是給實現(xiàn)了Logger接口的,被刷了油漆的(增加了功能的例如加密等)對象記錄日志
                 logger.log(msg);
             }
          }
          public class EncryptDecorator extends LoggerDecorator{
              public EncryptDecorator(Logger logger){
                  super(logger);
              }
              public void log(String msg){
                  //刷加密字符串的油漆
                  msg=this.encryptMsg(msg);
                  //記錄加密后的日志
                  logger.log(msg);
              }
          }
          //客戶端的調(diào)用
          public DecoratorClient{
              public static void main(String args[]){
                   Logger logger=new FileLogger();
                   Logger decorator=new EncryptDecorator(logger);
                   decorator.log("加密的字符串");
             }
          }
          這樣就基本把Decorator模式的應(yīng)用起來,當(dāng)然在項目中我們可能還需要更豐富一下我們的類,此處僅用這樣的簡單示例來講述。

          posted on 2008-08-18 23:11 周大俠 閱讀(445) 評論(1)  編輯  收藏

          評論

          # re: 設(shè)計模式:裝飾器模式Decorator 2009-09-26 15:38 王海軍
          寫得很有代表性!  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 溆浦县| 元阳县| 高安市| 高密市| 庄河市| 剑川县| 赤峰市| 广安市| 汉沽区| 交城县| 乌拉特前旗| 库车县| 龙山县| 商城县| 保康县| 永定县| 双鸭山市| 全南县| 巨野县| 土默特左旗| 镇宁| 沙田区| 江津市| 辽阳县| 江油市| 新民市| 广宁县| 江城| 上虞市| 临泽县| 孙吴县| 沐川县| 墨玉县| 赞皇县| 宁海县| 扬中市| 蚌埠市| 远安县| 湄潭县| 自治县| 习水县|