在适配器模式章节中我们讲到,适配器模式可以用来兼容老的版本接口。当时我们举了一个 JDK 的例子。
老版本的 JDK 提供了 Enumeration
类来遍历容器。新版本的 JDK 用 Iterator
类替代 Enumeration
。为了兼容老的客户端代码(使用老版本的 JDK 的代码),我们保留了 Enumeration
类,并且在 Collections
中仍然保留了 enumaration()
方法(因为我们一般是通过这个静态函数来创建一个容器的 Enumeration
类对象)。
不过,保留 Enumeration
和 enumaration()
方法,都只是为了兼容,实际上,跟适配器没有一点关系。到底哪一部分才是适配器呢?
在新版本的 JDK 中,Enumeration
类是适配器类。它适配客户端代码(使用 Enumeration
类)和新版本 JDK 中新的迭代器 Iterator
类。不过,从代码实现的角度来说,这个适配器模式的代码实现,跟经典的适配器模式的代码实现,差别稍微有点大。enumaration()
静态函数的逻辑和 Enumeration
适配器类的代码耦合在一起,enumaration()
静态函数直接通过 new 的方式创建了 匿名类对象。具体代码如下所示:
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
}
public class Collections {
// ...
public static <T> Enumeration<T> enumeration(final Collection<T> c) {
return new Enumeration<T>() {
private final Iterator<T> i = c.iterator();
public boolean hasMoreElements() {
return i.hasNext();
}
public T nextElement() {
return i.next();
}
};
}
// ...
}