Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中特定集合的迭代器实现是适配器设计模式的一个示例吗?_Java_Design Patterns_Iterator_Adapter - Fatal编程技术网

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

java中特定集合的迭代器实现是适配器设计模式的一个示例吗?,java,design-patterns,iterator,adapter,Java,Design Patterns,Iterator,Adapter,特定集合的迭代器实现是适配器设计模式的一个示例吗 例如: ArrayList的迭代器实现包装ArrayList adaptee,而HashSet的迭代器实现包装HashSet adaptee。有趣的视角 通常,适配器和迭代器模式都试图解决不同的问题。前者用于使现有的不兼容实体(类)在不修改它们的情况下相互工作,而, 后者有助于顺序访问某些聚合实体(列表或集合)的元素,而无需了解底层逻辑 回到你的问题上来 具体集合的迭代器实现就是一个例子 适配器设计模式 不是真的 当已经存在两个不兼容的类,并且您

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

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

有趣的视角

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

回到你的问题上来

具体集合的迭代器实现就是一个例子 适配器设计模式

不是真的

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


希望它能回答你的问题

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

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

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

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

但是我们需要为没有实现
java.util.Collection
java.lang.Iterable
的其他类创建适配器。例如,对于众所周知的
org.apache.commons.lang3.tuple.Pair
类。下面的示例显示如何创建适配器,该适配器允许对其属性(如集合)进行迭代:

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!");
                }
            }
        };
    }
}
对于集合,我们不需要这样做,因为它们的实现已经有了
iterator()
方法

另见:


不太可能,因为没有正在调整的底层接口。这只是一个实现的例子。你觉得下面的答案有用吗?
A
B