设计模式-11 迭代器模式

来源:互联网 发布:1080a最新x站免费域名 编辑:程序博客网 时间:2024/06/06 07:51

看了迭代器模式以后,我还是没有明白为什么要用这种模式。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++.然后下一次获取就是下一个元素。

0 0