迭代器模式

迭代器模式介绍

定义

提供一种方法访问一个容器中的元素,而又不暴露该对象的内部细节.

使用场景

遍历一个聚合对象,但是目前,java中有Collection集合,我们可以直接使用.

优点:

迭代一个对象时候,无需修改源代码.

类图体现

  • 抽象容器:一个接口,里面有增删改查的方法名,持有iterator()方法.例如java中的Collection接口.
  • 具体容器:实现抽象容器,实现其中方法,以及重写iterator方法.例如ArrayList实现List.
  • 抽象迭代器:定义遍历元素所需要的方法,一般有boolean hasNext(), Object next()方法.
  • 具体迭代器:实现迭代器中的方法.
img_1ad4fb7c2faa7b45ce55f85a1d6c923a.png

代码实现(仿照ArrayList)

1.定义容器Collection,持有抽象迭代器方法Iterator()


public interface Collection<T> {
    
    void  add(T  t);
    
    void remove(T t);
    
    Iterator<T> iterator();
    
    
}

2.定义抽象迭代器Iterator,定义迭代方法

public interface Iterator<T> {
    
    boolean hasNext();
    
    T next();
}

3.定义迭代器MyIterator实现

public  class MyIterator<T> implements Iterator<T> {
    
    private List<T> list=new ArrayList<>();
    
    private int cursor=0;
    
    public MyIterator(ArrayList<T> list) {
        // TODO Auto-generated constructor stub
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return cursor!=list.size();
    }

    @Override
    public T next() {
        // TODO Auto-generated method stub
        T obj=null;
        if(this.hasNext())
        {
            obj=list.get(cursor++);
        }
        return obj;
    }
    
    
}

4.实现具体容器

public class MyArrayList<T> implements Collection<T>{

    public ArrayList<T> list =new ArrayList<>();
    
    @Override
    public void add(T t) {
        // TODO Auto-generated method stub
        list.add(t);
    }

    @Override
    public void remove(T t) {
        // TODO Auto-generated method stub
        list.remove(t);
    }

    @Override
    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return new MyIterator<T>(list);
    }
    
    
    

}

5.测试类

public class Test {
    public static void main(String[] args) {
        /**
         * 其实,在collection中的
        ArrayList<String> array=new ArrayList<>();
        array.iterator();
        LinkedList<String> linkedList =new LinkedList<>();
        linkedList.iterator();
        HashSet<String> set=new HashSet<>();
        set.iterator();//内 map.keySet().iterator() d的iterator ,没有实现
        TreeSet<String> set1=new TreeSet<>();
        set1.iterator();*/
        
        
        
        MyArrayList<String> arrayList=new MyArrayList<>();
        arrayList.add("first");
        arrayList.add("second");
        
        Iterator<String> iterator =arrayList.iterator();
        
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

测试结果

first
second

迭代器在java中的体现

Collection集合框架

迭代器Iterator,是结合容器Collection来用的

img_e9e5917de8c11c79f91a9466df70d921.png

集合中迭代器的实现

如果想要迭代器, 就要根据容器实现相应的迭代器. 例如:

        ArrayList<String> array=new ArrayList<>();
        array.iterator();
    
        HashSet<String> set=new HashSet<>();
        set.iterator();//内 map.keySet().iterator() d的iterator ,没有实现
        

其中,ArrayList的迭代器实现在 他自己的内部类,而HashSet并没有实现自己的迭代器.


public interface List<E> extends Collection<E> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<E> iterator();

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //内部类迭代器
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

.....
}

总结

迭代器模式,java中,已经有了很好的体现和应用.当涉及到对象的遍历等操作,我们直接把他们放到集合中即可.没有必要画蛇添足,浪费资源.

本次学习,有利于理解java语言的设计,加深对java的理解和应用.每一次学习,都有对java的另一种理解.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值