美文网首页
迭代器模式

迭代器模式

作者: T_log | 来源:发表于2018-07-30 17:03 被阅读15次

概念

  1. 迭代器模式提供了一种方法访问一个容器中各个元素,而又不需要暴露该对象的内部细节
  2. 在1.中提到的容器,其实就是可以包含一组对象的数据结构,如Java中Collection和Set

角色

  1. Iterator:抽象迭代器
  2. ConcreteIterator:具体迭代器
  3. Aggregate :抽象容器
  4. Concrete Aggregate:具体容器

demo

  1. 先定义抽象迭代器,其实就是java.util下的迭代器
  2. hasNext返回该迭代器中是否还有未遍历过的元素
  3. next返回下一个元素
public interface Iterator<E> {

    boolean hasNext();

    E next();
    
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

具体的类实现了Iterator接口,并实现了其中的方法

/**
 * @author : jzb219@gmial.com
 * @description : 具体迭代器
 * @date : 2018/7/30 下午3:48
 */
public class MenuIterator implements Iterator {

    String[] foods;
    int position;

    public MenuIterator(String[] foods) {
        this.foods = foods;
    }

    @Override
    public boolean hasNext() {
        return position != foods.length;
    }

    @Override
    public Object next() {
        String food = foods[position];
        position += 1;
        return food;
    }
}

抽象容器

/**
 * @author : jzb219@gmial.com
 * @date : 2018/7/30
 */
public interface Menu {

    void add(String name);

    Iterator getIterator();
}

定义一个容器用来实现Menu

/**
 * @author : jzb219@gmial.com
 * @description : 具体容器
 * @date : 2018/7/30 下午3:55
 */
public class ChineseFoodMenu implements Menu {

    private String[] foods = new String[4];

    private int position = 0;

    @Override
    public void add(String name) {
        foods[position] = name;
        position += 1;
    }

    @Override
    public Iterator getIterator() {
        return new MenuIterator(this.foods);
    }
}

测试

/**
 * @author : jzb219@gmial.com
 * @description : 测试类
 * @date : 2018/7/30 下午3:56
 */
public class IteratorDomain {

    public static void main(String[] args) {
        ChineseFoodMenu chineseFoodMenu = new ChineseFoodMenu();
        chineseFoodMenu.add("红烧肉");
        chineseFoodMenu.add("剁椒鱼头");
        chineseFoodMenu.add("烤全羊");
        chineseFoodMenu.add("夫妻肺片");

        Iterator iterator = chineseFoodMenu.getIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
结果
红烧肉
剁椒鱼头
烤全羊
夫妻肺片

总结

1.迭代器使用很广泛,Java中提供了java.util.Iterator。而且很多容器(Collection,Set)都提供了对迭代器的支持

参考
http://www.hollischuang.com/archives/1765

写在最后

做一个灵魂和肉体分离的人,灵魂不受肉体的束缚,灵魂可以指挥肉体

相关文章

网友评论

      本文标题:迭代器模式

      本文链接:https://www.haomeiwen.com/subject/sawfvftx.html