浅显易懂Java规划形式之迭代器形式 (转)ITeye - 娱乐之横扫全球

浅显易懂Java规划形式之迭代器形式 (转)ITeye

2019-01-14 05:07:19 | 作者: 宛亦 | 标签: 迭代,容器,人物 | 浏览: 2135


从结构上能够看出,迭代器方法在客户与容器之间参加了迭代器人物。迭代器人物的参加,就能够很好的防止容器内部细节的露出,并且也使得规划符号“单一责任准则”。

留意,在迭代器方法中,详细迭代器人物和详细容器人物是耦合在一起的——遍历算法是与容器的内部细节严密相关的。为了使客户程序从与详细迭代器人物耦合 的窘境中脱离出来,防止详细迭代器人物的更换给客户程序带来的修正,迭代器方法笼统了详细迭代器人物,使得客户程序更具一般性和重用性。这被称为多态迭 代。

三、 举例

由于迭代器方法本身的规则比较松懈,所以详细完成也就形形色色。咱们在此仅举一例,底子不能将完成办法逐个出现。因此在举例前,咱们先来罗列下迭代器方法的完成办法。

1.迭代器人物界说了遍历的接口,可是没有规则由谁来操控迭代。在Java collection的运用中,是由客户程序来操控遍历的进程,被称为外部迭代器;还有一种完成办法就是由迭代器本身来操控迭代,被称为内部迭代器。外部 迭代器要比内部迭代器灵敏、强壮,并且内部迭代器在java言语环境中,可用性很弱。

2.在迭代器方法中没有规则谁来完成遍历算法。 如同天经地义的要在迭代器人物中完成。由于既便于一个容器上运用不同的遍历算法,也便于将一种遍历算法运用于不同的容器。可是这样就损坏掉了容器的封装 ——容器人物就要揭露自己的私有特点,在java中便意味着向其他类揭露了自己的私有特点。

那咱们把它放到容器人物里来完成好了。这样迭代器人物就被架空为只是寄存一个遍历当时方位的功用。可是遍历算法便和特定的容器紧紧绑在一起了。

而在Java Collection的运用中,供给的详细迭代器人物是界说在容器人物中的内部类。这样便维护了容器的封装。可是一起容器也供给了遍历算法接口,你能够扩展自己的迭代器。

好了,咱们来看下Java Collection中的迭代器是怎样完成的吧。

//迭代器人物,只是界说了遍历接口

public interface Iterator {
boolean hasNext();
Object next();
void remove();
}

//容器人物,这儿以List为例。它也只是是一个接口,就不罗列出来了
//详细容器人物,就是完成了List接口的ArrayList等类。为了突出重点这儿指罗列和迭代器相关的内容
//详细迭代器人物,它是以内部类的方法出来的。AbstractList是为了将各个详细容器人物的公共部分提取出来而存在的。

public abstract class AbstractList extends AbstractCollection implements List {
……
//这个就是担任创立详细迭代器人物的工厂办法
public Iterator iterator() {
return new Itr();
}

//作为内部类的详细迭代器人物

private class Itr implements Iterator {
int cursor = 0;
int lastRet = -1;
int expectedModCount = modCount;

public boolean hasNext() {
return cursor != size();
}

public Object next() {
checkForComodification();
try {
Object next = get(cursor);
lastRet = cursor++;
return next;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();

try {
AbstractList.this.remove(lastRet);
if (lastRet cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}


至于迭代器方法的运用。正如导言中所列那样,客户程序要先得到详细容器人物,然后再经过详细容器人物得到详细迭代器人物。这样便能够运用详细迭代器人物来遍历容器了……

四、 完成自己的迭代器

在完成自己的迭代器的时分,一般要操作的容器有支撑的接谈锋能够。并且咱们还要留意以下问题:

在迭代器遍历的过程中,经过该迭代器进行容器元素的增减操作是否安全呢?

在容器中存在复合目标的状况,迭代器怎样才能支撑深层遍历和多种遍历呢?

以上两个问题关于不同结构的容器人物,各不相同,值得考虑。

五、 适用状况

由上面的叙述,咱们能够看出迭代器方法给容器的运用带来以下优点:

1) 支撑以不同的办法遍历一个容器人物。依据完成办法的不同,作用上会有不同。

2) 简化了容器的接口。可是在java Collection中为了进步可扩展性,容器仍是供给了遍历的接口。

3) 对同一个容器目标,能够一起进行多个遍历。由于遍历状况是保存在每一个迭代器目标中的。

由此也能得出迭代器方法的适用范围:

1) 拜访一个容器目标的内容而无需露出它的内部表明。

2) 支撑对容器目标的多种遍历。

3) 为遍历不同的容器结构供给一个一致的接口(多态迭代)。

六、 总结

迭代器方法在咱们的运用中很广泛,期望本文能协助你了解它。如有不对之处,还请不吝指正。

(作者:ai92责任编辑:方舟)
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章