Java设计模式_(行为型)_迭代模式

引用百科

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


适用性

访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口


迭代子模式涉及的角色:
● 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。  
● 具体迭代子(RealIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。 
● 聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。 
● 具体聚集(RealAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
● 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。


具体实现:




相关代码

1、抽象聚集类

//抽象聚集角色类
public abstract class Aggregate {
	/**
	 * 工厂方法,创建相应迭代子对象的接口
	 */
	public abstract Iterator createIterator();
}

2、具体抽象聚集类实现

//具体聚集角色类
public class RealAggregate extends Aggregate {

	private Object[] objArray = null;

	/**
	 * 构造方法,传入聚合对象的具体内容
	 */
	public RealAggregate(Object[] objArray) {
		this.objArray = objArray;
	}

	@Override
	public Iterator createIterator() {
		return new RealIterator(this);
	}

	/**
	 * 取值方法:向外界提供聚集元素
	 */
	public Object getElement(int index) {

		if (index < objArray.length) {
			return objArray[index];
		} else {
			return null;
		}
	}

	/**
	 * 取值方法:向外界提供聚集的大小
	 */
	public int size() {
		return objArray.length;
	}
}


3、迭代接口
//抽象迭代接口
public interface Iterator {
	/**
	 * 迭代方法:移动到第一个元素
	 */
	public void first();

	/**
	 * 迭代方法:移动到下一个元素
	 */
	public void next();

	/**
	 * 迭代方法:是否为最后一个元素
	 */
	public boolean isDone();

	/**
	 * 迭代方法:返还当前元素
	 */
	public Object currentItem();
}


4、具体迭代实现类

//具体迭代子角色类
public class RealIterator implements Iterator {

	// 持有被迭代的具体的聚合对象
	private RealAggregate agg;
	// 内部索引,记录当前迭代到的索引位置
	private int index = 0;
	// 记录当前聚集对象的大小
	private int size = 0;

	public RealIterator(RealAggregate agg) {
		this.agg = agg;
		this.size = agg.size();
		index = 0;
	}

	/**
	 * 迭代方法:返还当前元素
	 */
	@Override
	public Object currentItem() {
		return agg.getElement(index);
	}

	/**
	 * 迭代方法:移动到第一个元素
	 */
	@Override
	public void first() {
		index = 0;
	}

	/**
	 * 迭代方法:是否为最后一个元素
	 */
	@Override
	public boolean isDone() {
		return (index >= size);
	}

	/**
	 * 迭代方法:移动到下一个元素
	 */
	@Override
	public void next() {
		if (index < size) {
			index++;
		}
	}

}


5、客户端Client测试

public class Client {

	public static void operation() {
		Object[] objArray = { "One", "Two", "Three", "Four", "Five", "Six" };
		// 创建聚合对象
		Aggregate aggregate = new RealAggregate(objArray);
		// 循环输出聚合对象中的值
		Iterator it = aggregate.createIterator();
		while (!it.isDone()) {
			System.out.println(it.currentItem());
			it.next();
		}
	}

	public static void main(String[] args) {
		operation();
	}
}

通过以上简单代码实现了迭代模式,同时循环迭代输出了数组中的内容!


迭代模式效果:

它支持以不同的方式遍历一个聚合。
迭代器简化了聚合的接口。
在同一个聚合上可以有多个遍历。

迭代子模式的优点

1)迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。

2)每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。

3)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值