设计模式学习笔记 - 开源实战一(上):通过剖析JDK源码学习灵活应用设计模式-适配器模式在 Collections 类中的应用

时间:2024-04-21 12:48:00

适配器模式章节中我们讲到,适配器模式可以用来兼容老的版本接口。当时我们举了一个 JDK 的例子。

老版本的 JDK 提供了 Enumeration 类来遍历容器。新版本的 JDK 用 Iterator 类替代 Enumeration 。为了兼容老的客户端代码(使用老版本的 JDK 的代码),我们保留了 Enumeration 类,并且在 Collections 中仍然保留了 enumaration() 方法(因为我们一般是通过这个静态函数来创建一个容器的 Enumeration 类对象)。

不过,保留 Enumerationenumaration() 方法,都只是为了兼容,实际上,跟适配器没有一点关系。到底哪一部分才是适配器呢?

在新版本的 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();
            }
        };
    }
    // ...
}