從集合類的升級聯想到Java適配器(Adapter)模式

          Historical Collection Classes(JDK1.1 之前)
          提供的容器有Arrays,Vector,Stack,Hashtable,Properties,BitSet。其中定義出一種走訪群集內各元素的標準方式,稱為Enumeration(列舉器)接口,用法如下:
          Vector v=new Vector();
          for (Enumeration enum =v.elements(); enum.hasMoreElements();) {
          Object o 
          = enum.nextElement();
          processObject(o);
          }

          而在JDK1.2版本中引入了Iterator接口,新版本的集合對象(HashSet,HashMap,WeakHeahMap,ArrayList,TreeSet,TreeMap, LinkedList)是通過Iterator接口訪問集合元素的。
          例如:
          List list=new ArrayList();
          for(Iterator it=list.iterator();it.hasNext();)
          {
              System.out.println(it.next());
          }

          這樣,如果將老版本的程序運行在新的Java編譯器上就會出錯。因為List接口中已經沒有elements(),而只有iterator()了。那么如何可以使老版本的程序運行在新的Java編譯器上呢?如果不加修改,是肯定不行的,但是修改要遵循“開-閉”原則。
          這時候我想到了Java設計模式中的適配器模式。

          /*
          *@author 我為J狂 建立日期 2007-4-18
          *
          */

          package net.blogjava.lzqdiy;

          import java.util.ArrayList;
          import java.util.Enumeration;
          import java.util.Iterator;
          import java.util.List;

          public class NewEnumeration implements Enumeration
          {

              Iterator it;
              
          public NewEnumeration(Iterator it)
              
          {
                  
          this.it=it;
                  
          // TODO Auto-generated constructor stub
              }


              
          public boolean hasMoreElements()
              
          {
                  
          // TODO Auto-generated method stub
                  return it.hasNext();
              }


              
          public Object nextElement()
              
          {
                  
          // TODO Auto-generated method stub
                  return it.next();
              }

              
          public static void main(String[] args)
              
          {
                  List list
          =new ArrayList();
                  list.add(
          "a");
                  list.add(
          "b");
                  list.add(
          "C");
                  
          for(Enumeration e=new NewEnumeration(list.iterator());e.hasMoreElements();)
                  
          {
                      System.out.println(e.nextElement());
                  }

              }

          }

          NewEnumeration是一個適配器類,通過它實現了從Iterator接口到Enumeration接口的適配,這樣我們就可以使用老版本的代碼來使用新的集合對象了。

          posted on 2007-04-18 19:29 我為J狂 閱讀(2044) 評論(8)  編輯  收藏 所屬分類: 設計模式

          評論

          # re: 學習了Java適配器模式有感 2007-04-18 19:32 久城

          學習!  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式 2007-04-18 19:48 劉甘泉

          恩,對象適配器  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式[未登錄] 2007-04-19 09:18 Matthew

          好!  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式 2007-04-19 13:23 icom

          good...  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式 2007-04-19 16:23 BeanSoft

          真是不錯...  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式 2007-04-19 17:22 Ivan Chen(西濱)

          有用嗎?你老的代碼也不知道NewEnumeration啊,這樣做只是讓來的代碼改一下,仍然可以用Enumeration的方式訪問集合,那倒不如直接用新的iterator訪問好了。  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器模式 2007-04-19 17:58 我為J狂

          @Ivan Chen(西濱)
          如果直接用Iterator接口訪問,那么客戶端(main方法中的代碼)需要修改的代碼會很多,我所做的工作的注主要目的就是使盡量少修改客戶端代碼,甚至不修改,而這正是Java設計模式中必需遵循的“開-閉”原則,即對擴展開放,而對修改關閉。  回復  更多評論   

          # re: 從集合類的升級聯想到Java適配器(Adapter)模式[未登錄] 2009-06-19 00:39 me

          沒明白,這幾行代碼在新java version不是可以用嘛,為什么要加Adapter
          Vector v=new Vector();
          for (Enumeration enum =v.elements(); enum.hasMoreElements();) {
          Object o = enum.nextElement();
          processObject(o);
          }
            回復  更多評論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乐业县| 桦川县| 通州区| 乌海市| 黔江区| 昭觉县| 马山县| 吉林省| 巩留县| 英吉沙县| 甘泉县| 麻栗坡县| 平邑县| 河东区| 岳池县| 清苑县| 荔波县| 辽源市| 千阳县| 苍南县| 车险| 阜新市| 蕉岭县| 乌拉特后旗| 开远市| 长子县| 仪征市| 华池县| 青河县| 屯留县| 鄂温| 疏附县| 萨迦县| 镇安县| 水富县| 申扎县| 郑州市| 青州市| 岳池县| 南安市| 福州市|