迭代器模式

在这里插入图片描述
迭代器的遍历数据结构,可以无视数据结构的具体实现。
在这个demo中,TeamSeven以数组结构实现;
Dawn以单链表实现。

package iterator;

public class Ninja {
	
	String name;
	
	String skill;
	
	//用于链表结构
	Ninja next;
	
	public Ninja(String name, String skill) {
		super();
		this.name = name;
		this.skill = skill;
	}
	
	@Override
	public String toString() {
		return "Ninja [name=" + name + ", skill=" + skill + "]";
	}
	
	public Ninja getNext() {
		return next;
	}
	
	public void setNext(Ninja next) {
		this.next = next;
	}
	
}


package iterator;

public interface MyIterator {
	
	boolean hasNext();
	
	Object next();
}

package iterator;

public interface MyIterable {
	
	MyIterator getMyIterator();
	
}

package iterator;

public class TeamSeven implements MyIterable{
	
	Ninja[] members;
	
	int index;
	
	public TeamSeven() {
		super();
		members=new Ninja[10];
		index=-1;
	}

	public void addMember(Ninja ninja) {
		members[++index]=ninja;
	}

	public int getSize() {
		return index;
	}
	
	public Ninja getAtIndex(int index) {
		return members[index];
	}
	
	@Override
	public MyIterator getMyIterator() {
		return new ArrayIterator(this);
	}

}

package iterator;

public class ArrayIterator implements MyIterator{
	
	private TeamSeven teamSeven;
	
	private int index;
	
	public ArrayIterator(TeamSeven teamSeven) {
		super();
		this.teamSeven = teamSeven;
		this.index = -1;
	}

	@Override
	public boolean hasNext() {
		if(index<teamSeven.getSize()) {
			return true;
		}
		return false;
	}

	@Override
	public Object next() {
		return teamSeven.getAtIndex(++index);
	}

}

package iterator;

public class Dawn implements MyIterable{
	
	Ninja ninja=new Ninja("链表头","占位");
	
	Ninja current=ninja;
	
	public void addNode(Ninja ninja) {
		this.current.setNext(ninja);
		this.current=ninja;
	}
	
	@Override
	public MyIterator getMyIterator() {
		return new LinkIterator(this);
	}

	public Ninja getNinja() {
		return ninja;
	}

	public void setNinja(Ninja ninja) {
		this.ninja = ninja;
	}

}

package iterator;

public class LinkIterator implements MyIterator{

	Dawn dawn;
	
	Ninja current;
	
	public LinkIterator(Dawn dawn) {
		super();
		this.dawn = dawn;
		current=dawn.getNinja();
	}

	@Override
	public boolean hasNext() {
		return current.getNext()!=null;
	}

	@Override
	public Object next() {
		current=current.getNext();
		return current;
	}

}

package iterator;

public class IteratorTest {
	
	public static void main(String[] args) {
		
		//数组
		Ninja kaKaXi=new Ninja("卡子哥","装遁");
		Ninja mingRen=new Ninja("呐撸多","嘴遁");
		Ninja zuoZhu=new Ninja("啥是gay","B遁");
		Ninja xiaoYing=new Ninja("撒库拉酱","哭遁");
		
		TeamSeven teamSeven=new TeamSeven();
		teamSeven.addMember(kaKaXi);
		teamSeven.addMember(mingRen);
		teamSeven.addMember(zuoZhu);
		teamSeven.addMember(xiaoYing);
		
		MyIterator arrayIterator=teamSeven.getMyIterator();
		while(arrayIterator.hasNext()) {
			System.out.println(arrayIterator.next());
		}
		
		//链表
		Ninja changMen=new Ninja("长门","轮回眼");
		Ninja diDaLa=new Ninja("迪达拉","炸弹人");
		Ninja jiaoDu=new Ninja("角度","老不死");
		Ninja feiDuan=new Ninja("飞段","杀不死");
		
		Dawn dawn=new Dawn();
		dawn.addNode(changMen);
		dawn.addNode(diDaLa);
		dawn.addNode(jiaoDu);
		dawn.addNode(feiDuan);
		
		MyIterator linkIterator=dawn.getMyIterator();
		while(linkIterator.hasNext()) {
			System.out.println(linkIterator.next());
		}
	}
}

打印结果:
Ninja [name=卡子哥, skill=装遁]
Ninja [name=呐撸多, skill=嘴遁]
Ninja [name=啥是gay, skill=B遁]
Ninja [name=撒库拉酱, skill=哭遁]
Ninja [name=长门, skill=轮回眼]
Ninja [name=迪达拉, skill=炸弹人]
Ninja [name=角度, skill=老不死]
Ninja [name=飞段, skill=杀不死]

小结:
1.为什么使用迭代器模式而不是简单的遍历:
因为迭代器模式能使数据结构透明化。在这个demo中同时使用了数组(TeamSeven)和链表(Dawn)两种数据结构,不管是TeamSeven还是Dawn只要实现MyIterable接口,Client(IteratorTest)就能通过MyIterator进行简单遍历而无视数据结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值