qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          黑馬程序員:java基礎之裝飾設計模式

          一、什么是裝飾設計模式
            當想要對已有的對象進行功能增強時,可以定義類,將已有對象傳入,基于已有的功能,并提供加強功能,那么自定義的類成為裝飾類。
            裝飾類通常會通過構造方法,傳遞進來一個需要裝飾的對象,然后基于這個對象,提供更強大的方法。
            下面是裝飾設計模式的一個例子,自己寫的MyBufferedReader,并提供了myReadLine方法,IO包中類BufferedReader采用原理也是類似的。
          /*
          裝飾設計模式:MyBufferedReader
          */
          importjava.io.*;
          classMyBufferedReader
          {
          privateFileReaderfr;
          MyBufferedReader(FileReaderfr)
          {
          this.fr=fr;
          }
          publicStringmyReadLine()throwsIOException
          {
          StringBuildersb=newStringBuilder();
          intch;
          while((ch=fr.read())!=-1)
          {
          if(ch=='\r')
          continue;
          elseif(ch=='\n')
          returnsb.toString();
          else
          sb.append((char)ch);
          }
          if(sb.length()!=0)
          returnsb.toString();
          returnnull;
          }
          publicvoidmyClose()throwsIOException
          {
          fr.close();
          }
          }
          classMyBufferedReaderDemo
          {
          publicstaticvoidmain(String[]args)throwsIOException
          {
          FileReaderfr=newFileReader("test.txt");
          MyBufferedReaderbr=newMyBufferedReader(fr);
          Stringline=null;
          while((line=br.myReadLine())!=null)
          {
          System.out.println(line);
          }
          br.myClose();
          }
          }
            二、裝飾和繼承的區別
            裝飾設計模式比繼承要靈活,避免了繼承體系的臃腫,而且降低了類與類之間的關系。
            裝飾類因為增強已有對象,具備的功能與已有對象是相同的,只不過提供了更強的功能。所以裝飾類和被裝飾類通常
            是屬于同一個體系的。
            如下所示:
          MyReaderMyReader
          |--MyTextReader|--MyTextReader
          |--MyBufferedTextReader|--MyMediaReader
          |--MyMediaReader|--MyBufferedReader
          |--MyBufferedMediaReader
            如果為了改進一些功能而繼承,就可能導致整個繼承樹過于臃腫,同時要考慮事物之間是否是父類和子類的關系。
            在IO包中,還有一個LineNumberReader,繼承了BufferedReader,復用了其中功能(readLine),同時是FileReader的裝飾類。如果想要獲取所讀文件中的行數,可以用這個裝飾類,其中主要提供了了setLineNumber(),getLineNumber()方法。

          posted on 2013-10-11 10:01 順其自然EVO 閱讀(240) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2013年10月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 麟游县| 内黄县| 札达县| 西乌珠穆沁旗| 汶川县| 梁平县| 新绛县| 连平县| 两当县| 陵水| 余姚市| 滨州市| 潞西市| 江达县| 广灵县| 河北区| 凤城市| 正镶白旗| 芜湖县| 侯马市| 禄劝| 巴中市| 大余县| 寿阳县| 长武县| 长寿区| 济南市| 南涧| 漯河市| 娱乐| 东阿县| 隆子县| 乌兰察布市| 达尔| 郑州市| 汕头市| 微博| 准格尔旗| 伊宁县| 大名县| 抚松县|