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

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
V+zmm101346 分钟前
基于微信小程序的在线选课系统springboot+论文源码调试讲解
java·小程序·毕业设计·mvc·springboot
罗政9 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第10章 插件与链路的结合:SpringBoot环境插件获取应用名
java·spring boot·pdf
simple_ssn11 分钟前
【蓝桥杯】走迷宫
java·算法
simple_ssn11 分钟前
【蓝桥杯】奇怪的捐赠
java·算法
huipeng92616 分钟前
第三章线性表+第四章ArrayList与顺序表
java·开发语言
ThetaarSofVenice24 分钟前
带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
java·适配器模式
酷讯网络_24087016028 分钟前
【全开源】Java多语言tiktok跨境商城TikTok内嵌商城送搭建教程
java·开发语言·开源
思忖小下31 分钟前
梳理你的思路(从OOP到架构设计)_设计模式Observer模式
观察者模式·设计模式·eit
蓝天星空1 小时前
spring cloud gateway 3
java·spring cloud
罗政1 小时前
PDF书籍《手写调用链监控APM系统-Java版》第9章 插件与链路的结合:Mysql插件实现
java·mysql·pdf