开发中常见的场景

  • JDK内置的迭代器(List/Set)

场景

  • 提供一种可以遍历集合对象的方式.又称为:游标cursor模式

  • 聚合对象:存储数据

  • 迭代器:遍历集合

QQ截图20161206130417.png

/**
 * 迭代器接口
 * @author Matrix42
 *
 */
public interface MyIterator {
    void first();//将游标指向第一个
    void next();//将游标指向下一个
    boolean hasNext();

    boolean isFirst();
    boolean isLast();

    Object getCurrentObject();//获取当前游标指向的对象
}
public class ConcreteAggregate {
    private List<Object> list = new ArrayList<Object>();

    public ConcreteAggregate() {
        super();
    }

    public void addObject(Object obj){
        this.list.add(obj);
    }

    public void removeObject(Object obj){
        this.list.remove(obj);
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    public MyIterator getIterator(){
        return new ConcreteIterator();
    }

    /**
     * 使用内部类定义迭代器,可以直接使用外部类的属性
     * @author Matrix42
     *
     */
    private class ConcreteIterator implements MyIterator{

        private int cursor;//定义游标用于记录遍历时的位置

        @Override
        public void first() {
            cursor = 0;

        }

        @Override
        public void next() {
           if(cursor<list.size()){
               cursor++;
           }
        }

        @Override
        public boolean hasNext() {
            return list.size() > cursor;
        }

        @Override
        public boolean isFirst() {
            return cursor==0?true:false;
        }

        @Override
        public boolean isLast() {
            return cursor==(list.size()-1)?true:false;
        }

        @Override
        public Object getCurrentObject() {
            return list.get(cursor);
        }

    }
}
public class Client {
    public static void main(String[] args) {
        ConcreteAggregate ca = new ConcreteAggregate();
        ca.addObject("aa");
        ca.addObject("bb");
        ca.addObject("cc");

        MyIterator iterator = ca.getIterator();
        while(iterator.hasNext()){
            System.out.println(iterator.getCurrentObject());
            iterator.next();
        }
    }
}