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

问题描述 投票:2回答:3

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

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

java design-patterns iterator adapter
3个回答
0
投票

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

但我们需要为其他没有实现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()方法。

也可以看看:


1
投票

有趣的观点!

一般来说,AdapterIterator模式都试图解决不同的问题。前者用于使现有的不兼容实体(类)相互协作而不修改它们,而 后者有助于顺序访问某些聚合实体(List或Collection)的元素,而无需理解底层逻辑。

回到你的问题,

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

并不是的。

当已经存在两个不兼容的类并且您尝试引入适配器以使两个类之间的通信成为可能时,需要适配器模式。但是在Iterator模式的情况下,我们已经定义了Iterator接口。所以情况正好相反。任何想要与Collection迭代器交互的新类都必须以能够理解Iterator接口的方式定义自己。此外,iterator限制了访问底层Collection的元素的功能,而Adapter支持两个类之间的通信。

希望它能回答你的问题。


0
投票

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

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

大多数模式利用一个或多个OOP基础,这可能是你混淆它们/发现重叠的原因,但是它们的关注区别于它们。

© www.soinside.com 2019 - 2024. All rights reserved.