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

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
AAA修煤气灶刘哥36 分钟前
监控摄像头?不,我们管这个叫优雅的埋点艺术!
java·后端·spring cloud
寻星探路1 小时前
Java EE初阶启程记09---多线程案例(2)
java·开发语言·java-ee
武子康1 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
珹洺1 小时前
Java-Spring入门指南(十五)SpringMVC注解开发
java·spring·microsoft
小满、1 小时前
什么是Maven?关于 Maven 的坐标、依赖管理与 Web 项目构建
java·maven
虫师c2 小时前
分布式系统设计模式:从理论到实践
微服务·设计模式·系统架构·高可用·分布式系统
半旧夜夏2 小时前
【设计模式】核心设计模式实战
java·spring boot·设计模式
半旧夜夏3 小时前
【Spring】AOP的核心原理配方
java·spring
qiuiuiu4133 小时前
CPrimer Plus第十六章C预处理器和C库总结2-qsort函数
java·c语言·算法