看了迭代器模式以后,我还是没有明白为什么要用这种模式。LinkedList和ArrayList的迭代器都是以内部类的形式。为什么要把这个迭代器单独拿出来?
类图
简单实现
要遍历英雄联盟里边的人物,一种方式是直接for循环遍历。另一种就是使用迭代器。当然也可以List自带的迭代器去遍历。这里我为了演示迭代器模式。所以用爹地器方式去实现。
容器内的元素
/**
* 英雄
*/
public class Hero {
/**
* 英雄名字
*/
private String name;
/**
* 英雄大招
*/
private String Big;
public Hero(String name, String big) {
Big = big;
this.name = name;
}
@Override
public String toString() {
return "Hero [name=" + name + ", Big=" + Big + "]";
}
}
迭代器
public interface Iiterator {
/**
* 是否有下个元素
*/
boolean hasNext();
/**
* 返回当前位置的元素 将下标值移至下一位
*/
Object next();
}
具体迭代器
/**
* 英雄迭代器
*
*/
public class HeroIterator implements Iiterator {
private List<Hero> list;
private int index;
public HeroIterator(List<Hero> list) {
this.list = list;
}
public boolean hasNext() {
return index <= list.size() - 1 && list.get(index) != null;
}
public Object next() {
Hero hero = list.get(index);
index++;
return hero;
}
}
容器
/**
* 召唤师峡谷
*/
public interface IsummonersRefit {
/**
* 返回一个迭代器对象
*/
Iiterator iterator();
}
容器实现
/**
* 召唤师峡谷
*/
public class SummonerRefit implements IsummonersRefit {
private List<Hero> list;
public SummonerRefit(){
initAllHeros();
}
private void initAllHeros() {
list = new ArrayList<>();
list.add(new Hero("卡特","死亡莲花"));
list.add(new Hero("盖伦","德玛西亚正义"));
list.add(new Hero("小鱼人","大鲨鱼"));
list.add(new Hero("安妮","大狗熊"));
list.add(new Hero("皇子","大锅扣"));
}
public Iiterator iterator() {
return new HeroIterator(list);
}
}
Client
/**
* 玩家想看看有哪些英雄
* @author YeLiang
*
*/
public class Player {
public static void main(String[] args) {
SummonerRefit summonerRefit = new SummonerRefit();
getAllhero(summonerRefit.iterator());
}
private static void getAllhero(Iiterator iterator){
while(iterator.hasNext()){
System.out.println(iterator.next().toString());
}
}
}
迭代器模式中,迭代器遍历容器时的核心思想就是每次根据容器下标获取相应的值。并让下边index++.然后下一次获取就是下一个元素。