当前位置: 首页 > news >正文

设计模式 16 迭代器模式

设计模式 16

  • 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
  • 行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

文章目录

  • 设计模式 16
    • 迭代器模式(Iterator Pattern)
      • 1 定义
      • 2 结构
      • 3 示例代码
      • 6 特点
      • 7 适用场景
      • 8 总结

迭代器模式(Iterator Pattern)

1 定义

迭代器模式的核心思想是提供一种统一的接口来遍历聚合对象中的元素,而不需要了解聚合对象的内部结构。通过这种方式,集合和遍历算法之间解耦,遍历的方式可以更容易地改变或扩展。

2 结构

迭代器模式包含以下角色:

  • 迭代器接口(Iterator): 定义访问和遍历元素的接口,通常包括 NextHasNextCurrent 等方法。
  • 具体迭代器(ConcreteIterator): 实现迭代器接口,负责具体元素的遍历。
  • 聚合接口(Aggregate): 定义创建迭代器对象的接口。
  • 具体聚合类(ConcreteAggregate): 实现聚合接口,返回具体的迭代器实例。

UML 类图

+-------------------------------+       +-------------------+
|   Aggregate                   |       |     Iterator      |
+-------------------------------+       +-------------------+
| + CreateIterator(): Iterator  |       | + HasNext(): bool |
+-------------------------------+       | + Next(): T       |^                               | + Current(): T    ||                               +-------------------+
+-------------------------------+
|ConcreteAggregate              |       +-------------------+
+-------------------------------+       | ConcreteIterator  |
| + CreateIterator(): Iterator  |       | + HasNext(): bool |
+-------------------------------+       | + Next(): T       || + Current(): T    |+-------------------+

3 示例代码

假设我们要实现一个自定义的 List 集合,并为它提供一个迭代器来遍历其中的元素。

迭代器接口

// 迭代器接口
public interface IIterator<T>
{bool HasNext();T Next();T Current { get; }
}

具体迭代器

// 具体迭代器
public class ListIterator<T> : IIterator<T>
{private readonly List<T> _list;private int _position = 0;public ListIterator(List<T> list){_list = list;}public bool HasNext(){return _position < _list.Count;}public T Next(){return _list[_position++];}public T Current => _list[_position];
}

聚合接口

// 聚合接口
public interface IAggregate<T>
{IIterator<T> CreateIterator();
}

具体聚合类

// 具体聚合类
public class CustomList<T> : IAggregate<T>
{private readonly List<T> _items = new List<T>();public void Add(T item){_items.Add(item);}public IIterator<T> CreateIterator(){return new ListIterator<T>(_items);}
}

客户端代码

class Program
{static void Main(string[] args){// 创建聚合对象并添加元素CustomList<string> list = new CustomList<string>();list.Add("Item 1");list.Add("Item 2");list.Add("Item 3");// 创建迭代器并遍历元素IIterator<string> iterator = list.CreateIterator();while (iterator.HasNext()){string item = iterator.Next();Console.WriteLine(item);}}
}

运行结果

Item 1
Item 2
Item 3

在这个例子中,我们创建了一个自定义的 CustomList 类,并为其提供了 ListIterator 作为具体的迭代器。ListIterator 实现了遍历列表元素的逻辑。客户端代码通过迭代器接口来遍历 CustomList 中的元素,而无需了解 CustomList 的内部结构。

6 特点

  • 优点:

    • 简化聚合类: 迭代器模式将遍历的职责从聚合类中分离出来,简化了聚合类的实现。

    • 一致的接口: 迭代器模式提供了一致的接口用于遍历不同类型的聚合对象,无需关心其内部实现。

    • 灵活性高: 可以自由更改迭代算法而不影响聚合类。

  • 缺点:

    • 开销增加: 对于非常简单的聚合类,引入迭代器模式可能会导致额外的开销和复杂性。

7 适用场景

  • 需要遍历聚合对象: 当需要遍历一个聚合对象中的元素时,可以使用迭代器模式。
  • 不同的遍历方式: 需要多种遍历方式或需要隐藏遍历的实现细节时,迭代器模式是一个合适的选择。
  • 统一的遍历接口: 当需要为不同类型的聚合对象提供统一的遍历接口时,迭代器模式非常适用。

8 总结

迭代器模式提供了一种遍历聚合对象的标准方法,通过解耦遍历逻辑和聚合对象的实现,增强了系统的灵活性和可扩展性。该模式特别适合需要在不暴露对象内部结构的情况下对对象进行遍历的场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 行得稳,跑得远,美团如何做到长期主义持续发力?
  • 电商行业如何解决“二清”问题
  • redis面试(二十六)总结
  • 【Java设计模式】上下文对象模式:简化上下文数据的访问
  • BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding
  • kubeadm部署k8s1.25.3一主二从集群(Containerd)
  • MySQL 查询优化详解
  • 兴业小知识|法拍房“捡漏”就能零元购?
  • 一篇搞懂C++ STL 智能指针监视器std::weak_ptr
  • Android Gsensor 移植
  • css-50 Projects in 50 Days(2)
  • Shell脚本入门:多命令处理
  • 2024-08-30作业
  • 一条执行24s的SQL产生7小时主备延时(案例详解)
  • 注册免费的vps:infinityfree
  • JavaScript-如何实现克隆(clone)函数
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CAP 一致性协议及应用解析
  • Javascript 原型链
  • JavaScript设计模式系列一:工厂模式
  • Java小白进阶笔记(3)-初级面向对象
  • jquery ajax学习笔记
  • LeetCode算法系列_0891_子序列宽度之和
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SSH 免密登录
  • 给第三方使用接口的 URL 签名实现
  • 构建工具 - 收藏集 - 掘金
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聊聊sentinel的DegradeSlot
  • 普通函数和构造函数的区别
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 深度学习入门:10门免费线上课程推荐
  • 通过npm或yarn自动生成vue组件
  • 我有几个粽子,和一个故事
  • 06-01 点餐小程序前台界面搭建
  • #pragma data_seg 共享数据区(转)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4) PIVOT 和 UPIVOT 的使用
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (四)c52学习之旅-流水LED灯
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)WLAN定义和基本架构转
  • (原創) 物件導向與老子思想 (OO)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)大型网站架构演变和知识体系
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ... 是什么 ?... 有什么用处?
  • .mysql secret在哪_MySQL如何使用索引
  • .net web项目 调用webService
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件