java 中特定集合的 Iterator 实现是 Adapter 设计模式的一个例子吗?

Is implementation of Iterator for a specific collection in java is an example of Adapter design pattern?

特定集合的迭代器实现是适配器设计模式的一个例子吗?

例如:- ArrayList 的迭代器实现包装 ArrayList 适配器,而 HashSet 的迭代器实现包装 HashSet 适配器。

有趣的视角!

一般来说,AdapterIterator 模式都试图解决不同的问题。前者用于使现有的不兼容实体(classes)在不修改它们的情况下相互工作,而
后者有助于顺序访问某些聚合实体(列表或集合)的元素,而无需了解底层逻辑。

回到你的问题,

Is implementation of Iterator for a specific collection is an example of Adapter design pattern ?

不是真的。

当已经存在两个不兼容的 classes 并且您试图引入一个 Adapter 以使两个 classes 之间的通信成为可能时,就会出现对 Adapter 模式的需求。但是在 Iterator 模式的情况下,我们已经定义了 Iterator 接口。所以恰恰相反。任何想要与 Collection 迭代器交互的新 class,都必须以能够理解 Iterator 接口的方式定义自己。此外,iterator 将功能限制为访问底层 Collection 的元素,而 Adapter 允许两个 class 之间的通信。

希望它能回答您的问题。

不,这两种模式都依赖于接口和 encapsulation, particularly information hiding,但是,正如 Girish 和 user207421 指出的那样,他们有不同的关注点:

  • 适配器模式解析不同的接口,利用接口和信息隐藏
  • 迭代器模式提供了一个一致的接口来迭代任意结构,也依赖于接口和信息隐藏

大多数模式利用一个或多个 OOP 基础知识,这可能是您混淆它们/发现重叠的原因,但正是它们的关注点 使它们与众不同。

否,因为 Java 中的所有集合实现都应扩展具有 iterator 方法的 java.util.Collection 接口。并且不需要为集合创建适配器来为其获取迭代器。

但是我们需要为其他未实现 java.util.Collectionjava.lang.Iterable 的 classes 创建适配器。例如,对于众所周知的 org.apache.commons.lang3.tuple.Pair class。下面的示例显示了如何创建允许迭代它的属性的适配器,如 over collection:

import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

import java.util.Iterator;

public class DesignPatterns {

    public static void main(String[] args) {
        Pair<String, String> pair = new ImmutablePair("A", "B");
        for (String item : new PairIterableAdapter<>(pair)) {
            System.out.println(item);
        }
    }
}

class PairIterableAdapter<T> implements Iterable<T> {

    private final Pair<T, T> pair;

    public PairIterableAdapter(Pair<T, T> pair) {
        this.pair = pair;
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<>() {
            private int counter = 2;

            @Override
            public boolean hasNext() {
                return counter-- > 0;
            }

            @Override
            public T next() {
                switch (counter) {
                    case 1:
                        return pair.getLeft();
                    case 0:
                        return pair.getRight();
                    default:
                        throw new IndexOutOfBoundsException("No more elements!");
                }
            }
        };
    }
}

以上代码打印:

A
B

对于集合,我们不需要这样做,因为它们的实现已经有了 iterator() 方法。

另请参阅: