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