设计模式之迭代器

参考博客:https://www.cnblogs.com/airwindow/archive/2012/06/25/2560811.html  侵权删除

迭代器  Iterator

2019-06-26  10:31:44

什么是迭代器模式:访问一个聚合对象的内容而无需暴露它的内部表示。例如,对于ArrayList、LinkedList等集合,客户都可以通过相同的操作方式遍历集合的对象。

迭代器的适用场景:需要对多种集合类对象提供统一的访问内容的方法。

迭代器的基本思想:在集合中实现迭代器,通过对迭代器的操作而访问集合内容。通过引入间接稳定的迭代器对象而封装了不同集合数据表示的差异性,使得客户端可以通过统一的迭代器对象访问集合。

迭代器的基本代码(仿照JDK中源码,Selector对应Iterator)

/**
 * 要求可以实现迭代的集合对象实现Selectable
 * 不直接实现Selector,是为了集合可以实现多种迭代器,可以根据需要获取相应的迭代器
 * @param <item>
 */
public interface Selectable<item> {
    public Selector<item> selector();
}
/**
 * 迭代器
 * 实现了对集合的多种操作,并向外部提供统一的接口
 * @param <item>
 */
public interface Selector<item> {
    public boolean hasNext();
    public item next();
    public boolean remove();
}
/**
 * 测试集合
 * 实现了Selectable
 * selector()方法返回相应的迭代器
 * 客户端可以通过 selector()方法获得迭代器,然后通过迭代器访问集合的对象。
 * @param <T>
 */
public class TestCase<T> implements Selectable<T> {
    private T[] arr;

    public TestCase() {
        arr = (T[])new Object[]{1,2,3,4,5,6,7,8,9};
    }

    @Override
    public Selector<T> selector() {
        return new Selector<T>() {
            int i = 0;
            @Override
            public boolean hasNext() {
                if(i<arr.length) return true;
                return false;
            }

            @Override
            public T next() {
                return arr[i++];
            }

            @Override
            public boolean remove() {
                return false;
            }
        };
    }
}
public class Test {
    /**
     * 测试代码
     */
    public static void main(String[] args) {
        TestCase<Integer> integerTestCase = new TestCase<>();
        Selector<Integer> selector = integerTestCase.selector();
//类似于Java中foreach语句
while(selector.hasNext()){ System.out.println(selector.next()); } } }
//结果
1
2
3
4
5
6
7
8
9
原文地址:https://www.cnblogs.com/youzoulalala/p/11088564.html