首页 > 其他分享 >Iterator设计模式

Iterator设计模式

时间:2022-08-24 01:44:25浏览次数:56  
标签:Iterator 迭代 lastRet elementData cursor new 设计模式 throw

迭代器设计模式

用集合类实现Aggregate接口,并实现其iterator方法,生成特定的迭代器对象,但返回时返回为Iterator类型,以此来抽象编程,实现解耦合的目的。

类图:

 

 

 当使用不同的集合实现类时,可以使用通用的代码,因为是面向接口编程,在循环中只使用了迭代器接口中的函数,达到了解耦的目的。

while(it.hasNext()){
  Book book = (Book)it.next();
  System.out.println(book.getName());  
}

 

原则:不要只使用具体类来编程,要优先使用抽象类和接口来编程。

 

 

例子

这个例子与本设计模式没有太多关系,但是确实是迭代器相关的问题。

当需求是按要求删除集合内的元素时,如果简单使用for循环进行删除,删除一个元素时,会使集合长度改变,影响取到的下一个元素。

并且增强for循环不能对元素进行删除,因为增强for使用迭代器实现的,某些对集合造成修改的操作会使迭代器失效。

具体哪些操作会使迭代器失效需要继续学习。

 

解决方案:

1.反向遍历从后往前遍历,每次不管删不删反正index都会减一,避免了越过元素的问题。

2.使用迭代器,迭代器在实现的过程中,考虑了删除元素的可能性:

当next时,用cursor指向下一个元素,而lastRet指向当前元素

当删除一个元素时,会将cursor返回到前一个元素,并且将lastRet置为-1

以上是ArrayList中的内部类的实现方法,代码如下:

    public Iterator<E> iterator() {
        return new Itr();
    }

    /**
     * An optimized version of AbstractList.Itr
     */
    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;

        Itr() {}

        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];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

其他集合实现方法应该类似。

 

3.使用流进行处理

list = list.stream().filter(u -> !"5".equals(u.getId()+"")).collect(Collectors.toList());

list.removeIf(u->"5".equals(u.getId()+""));

 

标签:Iterator,迭代,lastRet,elementData,cursor,new,设计模式,throw
From: https://www.cnblogs.com/darkpar/p/16618419.html

相关文章

  • 设计模式10 - 设计模式 - 适配器设计模式(高频-结构型)
    一、定义适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。    适配器模式......
  • Python 中 Iterator和Iterable的区别
    Python中list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少......
  • 常用设计模式(Python版)
    1.设计模式是什么?有什么用?设计模式是软件开发过程中经过验证的、用于解决特定环境下、重复出现的、特定问题的解决方案。根据GoF(GangOfFour),设计模式被分为三类:创......
  • 【设计模式】24.行为型模式-备忘录(Memento)
    一、描述定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复至原来保存的状态。理解:当需要保存某个对象的操......
  • 2022-08-21-设计模式之桥接模式
    java设计模式之桥接模式-学习整理23种设计模式---桥接模式什么是桥接模式?桥接模式的定义是?生活当中涉及到桥接模式的实例:桥接模式的结构及主要角色:咖啡案例实现(组......
  • 2022-08-21-设计模式之观察者模式
    java设计模式之观察者模式-学习整理23种设计模式---观察者模式什么是观察者模式?定义是什么?观察者模式包含的角色有什么?四个核心的角色:抽象观察者,具体观察者;抽象被观察......
  • 设计模式09 - 设计模式 - 装饰器模式(结构型)
    一、定义装饰器(Decorator)模式:指不改变现有对象结构的情况下,动态地给该对象增加额外功能。它是继承方式的一种替代方案。这种模式创建了一个装饰类,用来包装原有......
  • Spring体现的设计模式
    涉及到的模式工厂设计模式:Spring使用工厂模式通过BeanFactory、ApplicationContext创建bean对象。代理设计模式:SpringAOP功能的实现。单例设计模式:Sprin......
  • 设计模式学习(5)一致性
    组合模式在文件系统中,文件夹和文件具有一致性将文件夹和文件当作同一种东西看示例模拟一个文件系统。文件和文件夹都具有名称和大小,我们将其抽象成Entry。但是文件......
  • 设计模式之责任链
    概述责任链模式(ChainofResponsibilityPattern)属于行为型设计模式。它为请求创建了一个处理链条,这个链条上的所有对象都要对这个请求进行处理。比如我们生活中经常使用......