JAVA设计模式------Iterator模式(迭代器模式)

1、什么是Iterator

  在要遍历一个数组的时候,可以通过一个for循环语句来达到目的。

for(int i=1;i<arr.length;i++){
	System.out.println(arr[i]);
}

  而for循环的关键是通过i的递增来实现数组遍历,因此,我们将这种逐渐递增的i的功能抽象化,就成为了设计模式了的Iterator模式。
  Iterator模式主要用于在一个数据集中进行遍历。

2、角色分析

·抽象的迭代器(接口)

抽象的迭代器,作为通用的接口。在该迭代器中需要有的功能为:
hasNext:判断是否有下一个元素。(相当于for循环体里 i<arr.legth)
next:获取当前元n素,并使迭代器指向下一个元素。(相当于i++)

·具体的迭代器

负责具体实现抽象迭代器中的方法。包含了遍历集合所必须的信息。

·抽象的集合

该角色创建了Iterator角色的接口。这个接口只含有一个方法即使用迭代器的方法,会创建出“按照顺序访问保存在我内部元素的人”。

·具体的集合

负责实现抽象的集合内的方法,并创建具体的要迭代的角色。

3、代码示例

  创建一支军队,需要依次遍历军队中的士兵。

创建士兵类

class Solider{
	private String name;
	public Solider(String name) {
		this.name=name;
	}
	public String getName() {
		return this.name;
	}
}

创建抽象迭代器

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

创建抽象集合

interface Aggregate{
	public abstract Iterator iterator();
}

创捷具体的迭代器

由于next方法将迭代器指向了后一个元素,所以在访问到最后一个元素时就无需在迭代下去了。所以hasNext在最后一个元素的返回值应为false

class TroopIterator implements Iterator{
	private Troop troop;
	private int index;
	public TroopIterator(Troop troop) {
		this.troop=troop;
		this.index=0;
	}
	public boolean hasNext() {
		if(index<troop.getNum()) {//在未访问最后一个元素前返回为真
			return true;
		}else {
			return false;
		}
	}
	public Object next() {
		Solider solider=troop.getSoliderAt(index);
		index++;
		return solider;
	}
}

创建具体的集合

在除了实现接口外,需要构成一个元素数组。

class Troop implements Aggregate{
	private Solider[] soliders;
	private int last=0;
	public Troop(int num) {
		this.soliders=new Solider[num];
	}
	public Solider getSoliderAt(int index) {
		return this.soliders[index];
	}
	public void unitTroop(Solider solider) {
		this.soliders[this.last]=solider;
		this.last++;
	}
	public int getNum() {
		return last;
	}
	public Iterator iterator() {  //这一步相当于是吧这个数组传进了迭代器中
		return new TroopIterator(this);
	}
}

测试

public class Text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Troop troop = new Troop(5);
		troop.unitTroop(new Solider("Frisk"));
		troop.unitTroop(new Solider("Toriel"));
		troop.unitTroop(new Solider("Sans"));
		troop.unitTroop(new Solider("Papyrus"));
		troop.unitTroop(new Solider("Mettaton"));
		Iterator it =troop.iterator();
		while(it.hasNext()) {
			Solider solider = (Solider)it.next();
			System.out.println(solider.getName());
		}
	}

}
Frisk
Toriel
Sans
Papyrus
Mettaton

4、总结

  迭代器模式相当于规范了遍历元素的方式,使得在一些元素复杂的情况下可以通过迭代器来进行数组遍历。通过创建迭代器的接口和集合的接口降低了代码的耦合度,增加了代码的多用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值