设计模式——迭代器模式(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()");
    }
}

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
程序员黑豆11 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
mldong15 小时前
"applicant" 契约:退回发起人的闭环设计
java·架构
月华路15 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
用户9385156350715 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
gugucoding16 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
zww894911116 小时前
校园跑腿系统开发实战指南:从需求分析到上线部署全流程解析
java
Fluxart.ai17 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
名字还没想好☜17 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
IT爱学堂19 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
烬羽19 小时前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs