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 閱讀(241) 評論(0)  編輯  收藏


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


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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 托克托县| 从化市| 湖南省| 赣榆县| 抚州市| 东乡族自治县| 都安| 五莲县| 怀来县| 鹤山市| 肃北| 灯塔市| 临沂市| 邵阳市| 阿瓦提县| 吴桥县| 博罗县| 红原县| 苍梧县| 鹰潭市| 定州市| 宁河县| 博乐市| 伊吾县| 富平县| 马尔康县| 济南市| 宝清县| 沁水县| 喜德县| 惠安县| 卢龙县| 绵竹市| 涿州市| 洛阳市| 镇雄县| 邢台市| 根河市| 盖州市| 福建省| 都昌县|