二十三种设计模式第十七篇--迭代子模式

迭代子模式是一种行为型设计模式,它允许你按照特定方式访问一个集合对象的元素,而又不暴露该对象的内部结构。迭代子模式提供了一种统一的方式来遍历容器中的元素,而不需要关心容器的底层实现

该模式包含以下几个关键角色:

迭代器(Iterator):定义遍历集合元素的接口,包括访问下一个元素、判断是否还有元素等方法。

具体迭代器(ConcreteIterator):实现迭代器接口,具体实现遍历集合元素的方法。

容器(Aggregate):定义获取迭代器的方法,一般会返回一个实现了迭代器接口的具体迭代器对象。

具体容器(ConcreteAggregate):实现容器接口,具体实现获取迭代器的方法。

迭代子模式的核心思想是将集合的遍历操作从集合对象中分离出来,使得集合对象只需要关注存储和管理元素的功能。这样做的好处是,使得集合对象的结构变得简单,而且遍历操作的具体实现可以在迭代器中灵活调整,而不需要修改集合对象的代码。

迭代子模式在很多编程语言中都有应用,例如Java中的Iterator接口和.NET中的IEnumerator接口都是迭代子模式的实现。它能够帮助你更方便地遍历集合对象,并且能够使代码更加清晰和可扩展。

java 复制代码
public interface Container<T> {

   /**
    * 每个容器中有一个迭代器
    * @return
    */
   public Iterator iterator();

//   public void add( T t);
//
//   public void remove( T t);
//
//   public int size();

}
java 复制代码
public interface Iterator<T> {
   /**
    * 是否有下一个元素
    * @return
    */
   public boolean hasNext();

   /**
    * 提取下一个元素
    * @return
    */
   public T next();

}
java 复制代码
/**
 * 姓名容器,存很多用户的名字,能迭代(循环)
 */
public class NameRepository implements Container {

   public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};


   /**
    * 能获取到迭代器
    * @return
    */
   @Override
   public Iterator<String> iterator() {
      return new NameIterator();
   }


   /**
    * 利用内部类做一个迭代器的实现,以完成对   数组的循环..
    */
   private class NameIterator implements Iterator<String> {
      //index代表当前循环第几个下标的元素了.
      int index;  //因为当前容器的底层为一个数组, 可以通过索引下标进行迭代

      @Override
      public boolean hasNext() {
         if(  names==null||names.length<=0){
            return false;
         }
         if(index < names.length){
            return true;
         }
         return false;
      }
 
      @Override
      public String next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }     
   }
}
java 复制代码
public class IteratorPatternDemo {
   
   public static void main(String[] args) {
      //名字的容器
      NameRepository namesRepository = new NameRepository();

//      Iterator ite= namesRepository.iterator();
//      while(  ite.hasNext() ){
//         Object name= ite.next();
//         System.out.println(    name );
//      }

 
      for(Iterator<String> iter = namesRepository.iterator(); iter.hasNext();       ){
         String name = iter.next();
         System.out.println("Name : " + name);
      }
   }
}

迭代子模式适用的场景主要有:

  1. 需要统一遍历不同类型集合对象的方式:如果你有多个类型的集合对象,并且希望以一种统一的方式进行遍历操作,那么迭代子模式可以很好地解决这个问题。通过使用迭代子模式,你可以将遍历操作的实现细节封装在具体迭代器中,从而使得你能够以一种统一的方式遍历所有类型的集合对象。
  2. 希望隐藏集合对象的内部结构:在某些情况下,你可能不希望暴露集合对象的内部结构给客户端代码,而只允许通过特定接口进行遍历和访问。迭代子模式可以帮助你实现这种封装,客户端代码只需要通过迭代器接口与集合对象进行交互,而不需要了解集合对象的具体实现细节。
  3. 需要提供多种遍历方式:迭代子模式可以灵活地支持多种遍历方式,例如正序遍历、逆序遍历、按条件过滤遍历等。通过在具体迭代器中实现不同的遍历方式,你可以根据需要动态切换遍历方式,从而提供更多灵活性和可定制性。

总之,迭代子模式适用于任何需要遍历集合对象的场景,尤其是在需要统一遍历方式、隐藏集合对象内部结构或提供多种遍历方式的情况下。它能够提高代码的可读性、可维护性和可扩展性,并且能够使不同类型的集合对象之间的遍历操作变得更加一致和简单。

相关推荐
天天爱吃肉821825 分钟前
豆包 vs DeepSeek API 对比分析报告
android·java·大数据·开发语言·功能测试·嵌入式硬件·汽车
柏舟飞流26 分钟前
Spring Boot + Spring Security + RBAC:从登录鉴权到权限模型设计
java·spring boot·spring
AC赳赳老秦31 分钟前
OpenClaw + 飞书多维表格:自动同步数据、生成统计图表、触发自动化任务
java·大数据·python·缓存·自动化·deepseek·openclaw
CS_SKILL42 分钟前
吉比特 C++ 实习一面面经:一轮把 C++、容器、并发、排序和网络全扫了一遍
java·开发语言·校招面经·实习面经·技术面经·吉比特校招
Jul1en_1 小时前
【SpringCloud】SkyWalking 链路追踪知识详解及部署教程
java·后端·spring·spring cloud·skywalking
宸津-代码粉碎机1 小时前
Spring AI 企业级实战|智能记忆摘要+自动遗忘机制落地,彻底解决上下文爆炸与Token冗余
java·大数据·人工智能·后端·python·spring·云计算
逻极1 小时前
Spring Boot 微服务开发提速:我们如何将接口响应时间降低60%
java·spring boot·微服务·性能优化·自动配置
Yvonne爱编码1 小时前
JAVA EE初阶---DAY 2 计算机网络
java·开发语言·计算机网络·算法·java-ee·php
潇凝子潇1 小时前
IDEA插件
java·ide·intellij-idea
摇滚侠1 小时前
SSM 框架实战教程 SpringBoot 自动配置 176-179
java·spring boot·后端