美文网首页
16、ITEPTER(迭代器模式)

16、ITEPTER(迭代器模式)

作者: 我要扭开奥利奥 | 来源:发表于2019-05-28 21:24 被阅读0次

    目的

    提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部展示。

    使用场景

    • 访问一个聚合对象又不暴露他的外部显示
    • 支持对聚合对象的多种遍历
    • 为遍历不同的对象提供一个统一的接口,即支持多态迭代

    使用场景

    对于迭代器模式,我们最熟悉的就是Java的各种List的迭代器了。通过迭代器我们可以对于列表进行遍历,但是又不需要访问其内部元素也就是不需要进行下标访问。
    对于该模式我很感兴趣,对其进行实现如下:

    首先我们需要实现容器,也就是我们迭代的对象

    /**
     * 容器接口,定义了基本操作
     */
    public interface MyList {
        void add(Object o);
        Object get(int index);
        Iterator iterator();
        int getSize();
    }
    
    
    /**
     * 容器具体实现类,通过该类具体实现list的基本功能
     */
    public class ConcreteList implements MyList{
        private Object[] list;
        private int size = 0;   //代表最多能够存放多少数据
        private int index = 0;  //代表已经存放了多少数据
        public ConcreteList(){
            index = 0;
            size = 8;
            list = new Object[size];
        }
    
        @Override
        public void add(Object o){
            if(index < size){
                list[index++] = o;
            }else{
                //数组长度不够,扩容
                Object[] tmp = new Object[size<<1];
                for(int i = 0;i < index;i++){
                    tmp[i] = list[i];
                }
                tmp[index++] = o;
                list = tmp;
            }
        }
        @Override
        public Iterator iterator(){
            return new ConcreteIterator(this);
        }
        @Override
        public Object get(int index){
            if(index  < size){  //判断区间是否正常
                return list[index];
            }else{
                return null;
            }
        }
        @Override
        public int getSize(){
            return index;
        }
    }
    

    现在我们需要实现的就是迭代器了,为了提高迭代器的扩展型性和适用性,我们把迭代器操作的的对象设置为Object类

    /**
     * 为了简单起见,只实现两个最简单的功能
     * 为了支持多态性,next的返回值为Object
     */
    public interface Iterator {
        boolean hasNext();
        Object next();
    }
    
    /**
     * 迭代器接口的具体实现类,在这个类里面实现接口定义的功能
     */
    public class ConcreteIterator implements Iterator{
        private MyList list = null;
        private int index;
        public ConcreteIterator(MyList list){
            super();
            this.list = list;
        }
        @Override
        public boolean hasNext(){
            return index < list.getSize();
        }
        @Override
        public Object next(){
            if(index < list.getSize())
                return list.get(index++);
            else
                return null;
        }
    }
    

    最后是测试文件

    public class Client {
        public static void main(String[] args) {
            MyList list = new ConcreteList();
            //由于Java对于基本类型会进行自动装箱
            //因此可以直接添加基本类型数据
            list.add(10);
            list.add(20);
            list.add(30);
            list.add(1.23f);
            list.add(3.45d);
            Iterator iterator = new ConcreteIterator(list);
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }
    

    输出结果如下:

    10
    20
    30
    1.23
    3.45
    

    相关文章

      网友评论

          本文标题:16、ITEPTER(迭代器模式)

          本文链接:https://www.haomeiwen.com/subject/dlwjtctx.html