针对特定集合的Iterator实现是Adapter设计模式的一个示例吗?
例如:- ArrayList的迭代器实现包装ArrayList适配器,而HashSet的迭代器实现包装HashSet适配器。
答案 0 :(得分:1)
有趣的观点!
通常,Adapter
和Iterator
模式都试图解决不同的问题。前者用于使现有的不兼容实体(类)彼此协同工作而不修改它们,而
后者有助于顺序访问某些聚合实体(列表或集合)的元素,而无需了解底层逻辑。
回到您的问题,
针对特定集合的Iterator实现是一个示例 适配器设计模式?
不是真的。
当已经存在两个不兼容的类并且您试图引入一个适配器以使两个类之间的通信成为可能时,就需要使用适配器模式。但是对于Iterator模式,我们已经定义了Iterator
接口。事实恰恰相反。任何想要与Collection
迭代器进行交互的新类,都必须以能够理解Iterator接口的方式定义自己。此外,iterator
限制了访问基础Collection元素的功能,而Adapter
则启用了两个类之间的通信。
希望它能回答您的问题。
答案 1 :(得分:0)
否,两种模式都依赖于接口和encapsulation,尤其是information hiding,但是,正如Girish和user207421指出的那样,它们有不同的关注点:
大多数模式都利用一种或多种OOP基础知识,这可能是您混淆它们/发现重叠之处的原因,但这是它们的关注点所造成的。
答案 2 :(得分:0)
否,因为Java
中的所有集合实现都应扩展具有iterator方法的java.util.Collection
接口。无需创建用于收集的适配器来为其获取迭代器。
但是我们需要为其他未实现java.util.Collection
或java.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()
方法。
另请参阅: