设计模式行为型迭代器模式(Iterator)

    概述

    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.

    适用性

    1.访问一个聚合对象的内容而无需暴露它的内部表示.

    2.支持对聚合对象的多种遍历.

    3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代).

    参与者

    1.Iterator

    迭代器定义访问和遍历元素的接口.

    2.ConcreteIterator

    具体迭代器实现迭代器接口.

    对该聚合遍历时跟踪当前位置.

    3.Aggregate

    聚合定义创建相应迭代器对象的接口.

    4.ConcreteAggregate

    具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.

    类图

 

    示例代码:

    package com.sql9.actioned;

    import java.util.ArrayList;

    import java.util.List;

    /**

    * 迭代器模式 实现示例

    * @author sean

    */

    interface IIterator<T> {

    T next();

    void first();

    void last();

    boolean hasNext();

    }

class IIteratorImpl<T> implements IIterator<T> {

    private IList<T> list;

    private int index;

    public IIteratorImpl (IList<T> list) {

    index = 0;

    this.list = list;

    }

    @Override

    public T next() {

    T t = list.get(index);

    index++;

    return t;

    }

    @Override

    public void first() {

    index = 0;

    }

    @Override

    public void last() {

    index = list.size();

    }

    @Override

    public boolean hasNext() {

    return index < list.size();

    }

    }

    interface IList<T> {

    IIterator<T> iterator();

    T get(int index);

    int size();

    void add(T obj);

    }

    class IListImpl<T> implements IList<T> {

    private List<T> list;

    private int index;

    public IListImpl() {

    list = new ArrayList<T>();

    index = 0;

    }

    @Override

    public IIterator<T> iterator() {

    return new IIteratorImpl<T> (this);

    }

    @Override

    public T get(int index) {

    return list.get(index);

    }

    @Override

    public int size() {

    return list.size();

    }

    @Override

    public void add(T obj) {

    list.add(obj);

    }

    }

    public class IteratorTest {

    public static void main(String[] args) {

    // 2 ways of iteration

    IList<String> list = new IListImpl<String>();

    list.add(“a”);

    list.add(“b”);

    list.add(“c”);

    // 1st way

    System.out.println(“1. using iterator to traverse:”);

    IIterator<String> iter = list.iterator();

    while (iter.hasNext()) {

    System.out.println(iter.next());

    }

    // 2nd way

    System.out.println(“2. using list to traverse: ”);

    for (int i=0; i<list.size(); i++) {

    System.out.println(list.get(i));

    }

    }

    }

    结果:

    1. using iterator to traverse:

    a

    b

    c

    2. using list to traverse:

    a

    b

    c

广州达内,www.gztarena.com www.gdtarena.com www.s-tarena.com
原文地址:https://www.cnblogs.com/javaitpx/p/2830684.html