迭代器的遍历数据结构,可以无视数据结构的具体实现。
在这个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进行简单遍历而无视数据结构。