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

          我要飛得更高...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            19 隨筆 :: 0 文章 :: 5 評論 :: 0 Trackbacks

          2008年8月18日 #

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

          public class FileLogger implements Logger {

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

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

          主站蜘蛛池模板: 淮安市| 新巴尔虎右旗| 永安市| 恩施市| 棋牌| 南投县| 阿拉尔市| 雷波县| 扬州市| 长宁县| 枞阳县| 邹平县| 永善县| 金沙县| 咸宁市| 聊城市| 民县| 苏州市| 新巴尔虎右旗| 若羌县| 皋兰县| 武定县| 中方县| 盘锦市| 巴里| 兰坪| 剑阁县| 松溪县| 彭阳县| 和田市| 瑞金市| 曲麻莱县| 临武县| 大名县| 山东省| 隆安县| 汉中市| 内丘县| 界首市| 汨罗市| 湛江市|