迭代器模式

简介: 迭代器模式(Iterator): 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。用途:在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化

迭代器模式(Iterator): 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示

用途:在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方法。

举个例子:

Iterator it = list.iterator();
    while(it.hasNext()){
 //do some businesss logic
}
迭代器模式角色组成:
  
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
  2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
  3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
  4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口。


UML图


由上图可知,在客户与容器之间加入了迭代器角色,就可以很好的避免容器内部细节的暴露,从而达到单一职责原则的目的。

注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代。

来看一个Java例子:

package cn.java.iterator;
public class Item {
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	} 
	
}
Iterator接口:

package cn.java.iterator;

public interface Iterator {
	 Item first();

	 Item next();

	 boolean isDone();

	 Item currentItem();
}

Iterator实现类:

package cn.java.iterator;

import java.util.Vector;

public class Controller implements Iterator {

	private int current = 0;
	private Vector channel;

	public Controller(Vector v) {
		channel = v;
	}

	public Item first() {
		current = 0;
		return (Item) channel.get(current);
	}

	public Item next() {
		current++;
		return (Item) channel.get(current);
	}

	public Item currentItem() {
		return (Item) channel.get(current);
	}

	public boolean isDone() {
		return current >= channel.size() - 1;
	}

}

Aggregat 接口

package cn.java.iterator;

public interface Aggregat {
	  Iterator createIterator();
}

实现类:

package cn.java.iterator;

import java.util.Vector;

public class ConcreteAggregat implements Aggregat {

	private Vector vector = null;

	public Vector getVector() {
		return vector;
	}

	public void setVector(final Vector vector) {
		this.vector = vector;
	}

	public ConcreteAggregat() {
		vector = new Vector();
		vector.add("vector 1");
		vector.add("vector 2");
	}

	@Override
	public Iterator createIterator() {
		return new Controller(vector);
	}

}

测试类:

package cn.java.iterator;

public class IteratorClient {
	public static void main(String[] args) {
		final Aggregat agg = new ConcreteAggregat();
		final Iterator iterator = agg.createIterator();
		System.out.println(iterator.first());
		while (!iterator.isDone()) {
			System.out.println(iterator.next());
		}
	}
}

从上面的示例中就可以看出,尽管我们没有显示的引用迭代器,但实质还是通过迭代器来遍历的。迭代器模式就是分离了集合对象的迭代行为,抽象出一个迭代器类来负责,这样既可做到不暴露集合的内部结构,又可以让外部代码可以透明的访问集合内部的元素。现在的高级语言都对迭代器做了一定的封装,就像文章开始用迭代器来循环遍历。


目录
相关文章
|
3月前
|
设计模式 Java 数据挖掘
聊聊Java设计模式-迭代器模式
迭代器(Iterator)模式,也叫做游标(Cursor)模式。我们知道,在Java 容器中,为了提高容器遍历的方便性,我们利用迭代器把遍历逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合容器的内部结构。
43 0
聊聊Java设计模式-迭代器模式
|
4月前
|
设计模式 uml C++
行为型 迭代器模式
行为型 迭代器模式
20 0
|
6月前
|
设计模式 存储 算法
设计模式~迭代器模式(Iterator)-20
迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。迭代器模式已经被淘汰,java中已经把迭代器运用到各个聚集类(collection)中了,使用java自带的迭代器就已经满足我们的需求了 目录 迭代器模式(Iterator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项 (5)应用实例: 代码
25 0
|
9月前
|
设计模式 存储 Java
迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象中每个元素的方法,而不暴露其内部实现。
57 1
|
10月前
|
容器
关于迭代器模式我所知道的
关于迭代器模式我所知道的
40 0
|
11月前
|
设计模式 Java 索引
Java设计模式-迭代器模式(Iterator)
Java设计模式-迭代器模式(Iterator)
|
JavaScript 前端开发
简单理解迭代器模式
这几天研究了一下迭代器模式,期间有一段时间经常搞不太懂一些概念与概念之间的关系,今天来整理一下。
101 0
|
设计模式 算法 Java
Java设计模式 ->迭代器模式
Java设计模式 ->迭代器模式
64 0
|
设计模式 存储 容器
我学会了,迭代器模式
迭代器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
83 0
我学会了,迭代器模式
|
Java 容器
迭代器模式
迭代器模式
82 0