设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码

文章目录

  • 一、迭代器模式
  • 二、例子
    • [2.1 菜鸟例子](#2.1 菜鸟例子)
      • [2.1.1 定义迭代器接口](#2.1.1 定义迭代器接口)
      • [2.1.2 定义迭代对象接口------用于返回一个迭代器](#2.1.2 定义迭代对象接口——用于返回一个迭代器)
      • [2.1.3 实现 迭代对象 和 迭代器](#2.1.3 实现 迭代对象 和 迭代器)
      • [2.1.4 使用](#2.1.4 使用)
    • [2.2 JDK源码------ArrayList](#2.2 JDK源码——ArrayList)
    • [2.3 Spring源码------DefaultListableBeanFactory](#2.3 Spring源码——DefaultListableBeanFactory)
  • 三、其他设计模式

一、迭代器模式

类型: 行为型模式
目的: 用于顺序访问集合对象的元素,使用者不需要知道集合对象的底层表示。

二、例子

2.1 菜鸟例子

2.1.1 定义迭代器接口

java 复制代码
public interface Iterator {
   public boolean hasNext();
   public Object next();
}

2.1.2 定义迭代对象接口------用于返回一个迭代器

java 复制代码
public interface Container {
   public Iterator getIterator();
}

2.1.3 实现 迭代对象 和 迭代器

java 复制代码
public class NameRepository implements Container {
   public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};
 
   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }
 
   private class NameIterator implements Iterator {
 
      int index;
 
      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }
 
      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }     
   }
}

2.1.4 使用

java 复制代码
public class IteratorPatternDemo {
   
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();
 
      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      }  
   }
}

2.2 JDK源码------ArrayList

java 复制代码
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
	 @Override
     public Iterator<E> iterator() {
        return new ArrayItr<>(a);
     }
}
private static class ArrayItr<E> implements Iterator<E> {
    private int cursor;
    private final E[] a;

    ArrayItr(E[] a) {
        this.a = a;
    }

    @Override
    public boolean hasNext() {
        return cursor < a.length;
    }

    @Override
    public E next() {
        int i = cursor;
        if (i >= a.length) {
            throw new NoSuchElementException();
        }
        cursor = i + 1;
        return a[i];
    }
}

2.3 Spring源码------DefaultListableBeanFactory

java 复制代码
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

	private volatile List<String> beanDefinitionNames;
    private volatile Set<String> manualSingletonNames;

    public Iterator<String> getBeanNamesIterator() {
        CompositeIterator<String> iterator = new CompositeIterator();
        iterator.add(this.beanDefinitionNames.iterator());
        iterator.add(this.manualSingletonNames.iterator());
        return iterator;
    }
}

迭代器CompositeIterator

java 复制代码
public class CompositeIterator<E> implements Iterator<E> {
    private final Set<Iterator<E>> iterators = new LinkedHashSet();
    private boolean inUse = false;

    public CompositeIterator() {
    }

    public void add(Iterator<E> iterator) {
        Assert.state(!this.inUse, "You can no longer add iterators to a composite iterator that's already in use");
        if (this.iterators.contains(iterator)) {
            throw new IllegalArgumentException("You cannot add the same iterator twice");
        } else {
            this.iterators.add(iterator);
        }
    }

    public boolean hasNext() {
        this.inUse = true;
        Iterator var1 = this.iterators.iterator();

        Iterator iterator;
        do {
            if (!var1.hasNext()) {
                return false;
            }

            iterator = (Iterator)var1.next();
        } while(!iterator.hasNext());

        return true;
    }

    public E next() {
        this.inUse = true;
        Iterator var1 = this.iterators.iterator();

        Iterator iterator;
        do {
            if (!var1.hasNext()) {
                throw new NoSuchElementException("All iterators exhausted");
            }

            iterator = (Iterator)var1.next();
        } while(!iterator.hasNext());

        return iterator.next();
    }

    public void remove() {
        throw new UnsupportedOperationException("CompositeIterator does not support remove()");
    }
}

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
m0_7482480223 分钟前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
aloha_78930 分钟前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
我命由我123451 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88881 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
kyle~1 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
曹朋羽1 小时前
Spring EL 表达式
java·spring·el表达式
沐浴露z2 小时前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
No0d1es2 小时前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
9号达人2 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
超级苦力怕2 小时前
Java 为何 long a = 999999999 能过;long a = 9999999999 报错?一文讲透“宽化转换”
java