迭代模式

2018-11-02  本文已影响0人  要学的东西太多了

迭代模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。我们常用的java迭代器就是这个模式。其优点是:(1)迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。(2)每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。(3)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。

示例如下:

public class Iteration {
    public static void main(String[] a){
        Iteration iteration=new Iteration();
        String[] strings={"假假按揭","22","进度框为空","kkk"};
        Aterator aterator=iteration.new MySet(strings).createIterator();
        while (!aterator.isOver()){
            System.out.println(aterator.currentItem());
            aterator.next();
        }
    }

    abstract class Aterator{
        protected ISet iSet;
        protected int index=0;
        public Aterator(ISet iSet) {
            this.iSet = iSet;
            index=0;
        }
        abstract void first();
        abstract void next();
        abstract Object currentItem();
        abstract boolean isOver();
    }

    interface ISet{
        int getSize();
        Object getObject(int index);
        Aterator createIterator();
    }

    class MySet implements ISet{
        private Object[] objects;

        public MySet(Object[] objects) {
            this.objects = objects;
        }

        @Override
        public int getSize() {
            return objects.length;
        }

        @Override
        public Object getObject(int index) {
            if(index>=objects.length)
                return null;
            else
                return objects[index];
        }

        @Override
        public Aterator createIterator() {
            return new MyIterator(this);
        }

        class MyIterator extends Aterator{
            private MyIterator(ISet iSet) {
                super(iSet);
            }

            @Override
            public void first() {
                index=0;
            }

            @Override
            public void next() {
                if(index<iSet.getSize()){
                    index++;
                }
            }

            @Override
            public Object currentItem() {
                return iSet.getObject(index);
            }

            @Override
            public boolean isOver() {
                return index==iSet.getSize();
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读