Java中针对特定集合的Iterator实现是适配器设计模式的一个示例吗?

时间:2019-04-13 08:59:15

标签: java design-patterns iterator adapter

针对特定集合的Iterator实现是Adapter设计模式的一个示例吗?

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

3 个答案:

答案 0 :(得分:1)

有趣的观点!

通常,AdapterIterator模式都试图解决不同的问题。前者用于使现有的不兼容实体(类)彼此协同工作而不修改它们,而
后者有助于顺序访问某些聚合实体(列表或集合)的元素,而无需了解底层逻辑。

回到您的问题,

  

针对特定集合的Iterator实现是一个示例   适配器设计模式?

不是真的。

当已经存在两个不兼容的类并且您试图引入一个适配器以使两个类之间的通信成为可能时,就需要使用适配器模式。但是对于Iterator模式,我们已经定义了Iterator接口。事实恰恰相反。任何想要与Collection迭代器进行交互的新类,都必须以能够理解Iterator接口的方式定义自己。此外,iterator限制了访问基础Collection元素的功能,而Adapter则启用了两个类之间的通信。

希望它能回答您的问题。

答案 1 :(得分:0)

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

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

大多数模式都利用一种或多种OOP基础知识,这可能是您混淆它们/发现重叠之处的原因,但这是它们的关注点所造成的。

答案 2 :(得分:0)

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

但是我们需要为其他未实现java.util.Collectionjava.lang.Iterable的类创建适配器。例如,对于著名的org.apache.commons.lang3.tuple.Pair类。下面的示例显示了如何创建适配器,该适配器允许对其属性进行遍历,例如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()方法。

另请参阅: