迭代器模式(Iterator)

迭代器模式(Iterator)

1.意图

提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。
针对不同的需要,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些遍历操作,你可能也不希望列表的接口中充斥着各种不同遍历的操作。有时还可能需要在同一个表列上同时进行多个遍历。
迭代器模式可用来:
• 访问一个聚合对象的内容而无需暴露它的内部表示。
• 支持对聚合对象的多种遍历。
• 为遍历不同的聚合结构提供一个统一的接口 (即, 支持多态迭代)。

2.特点

ConcreteAggregate: 具体聚集
实现Iterable接口, 返回ConcreteIterator的一个适当的实例;
ConcreteIterator : 具体迭代器
实现Iterator接口(最好作为具体聚集的内部类), 对该聚集遍历时跟踪当前位置.

3.UML类图

迭代器模式

4.代码

/**
 * 迭代器接口
 */
public interface MyIterator {
    void first();//将游标指向第一个元素
    void next();//将游标指向下一个元素
    boolean hasNext();//判断是否有下一个元素
    boolean isFirst();//判断是否是第一个元素
    boolean isLast();//判断是否是最后一个元素
    Object getCurrentObj();//获取当前对象
}
/**
 * 自定义聚集类
 */
public class ConcreteMyAggregate {
    private List<Object> list = new ArrayList<>();
    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 createIterator(){
        return new ConcreteIterator();
    }

    //使用内部类来定义迭代器,好处就是可以直接使用外部类的属性
    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() {
            //如果游标<list的大小,则说明还有下一个
            if (cursor<list.size()) {
                return true;
            }
            return false;
        }
        @Override
        public boolean isFirst() {
            return cursor==0?true:false;
        }
        @Override
        public boolean isLast() {
            //判断游标是否是容器的最后一个
            return cursor==(list.size()-1)?true:false;
        }
        @Override
        public Object getCurrentObj() {
            return list.get(cursor);//获取当前游标指向的元素
        }
    }
}
public class IteratorTest {
    public static void main(String[] args) {
        ConcreteMyAggregate cma = new ConcreteMyAggregate();
        cma.addObject("111");
        cma.addObject("222");
        cma.addObject("333");
        cma.addObject("444");

        MyIterator iterator = cma.createIterator();
        cma.removeObject("111");//如果删除一个元素的话,迭代的时候也同样会被删除
        while (iterator.hasNext()) {
            System.out.println(iterator.getCurrentObj());//获取当前对象
            iterator.next();//将游标向下移
        }
    }
}

猜你喜欢

转载自blog.csdn.net/oyueyang1/article/details/79731341