从集合类的升级联想到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狂 阅读(2028) 评论(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)

常去逛逛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜