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

设计模式之Iterator模式

STL里的iterator就是应用了iterator模式。

一、什么是迭代模式

Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式。

二、不使用迭代模式的应用

在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题。或者说,如果不使用Iterator模式,会存在什么问题。

  1. 由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法
  2. 让调用者自己实现遍历。直接暴露数据细节给外部。

三、不使用迭代模式的缺点

以上方法1与方法2都可以实现对遍历,这样有问题呢?

在实现方法1中

  1. 容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。
  2. 往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。

在实现方法2中,

  1. 容器本身未实现任何遍历方法,把这个遍历的任务交给了调用者,这样一来,暴露了容器本身的实现细节
  2. 如果一旦容器内部的数据接口发生变化,比如由于某种原因,BookList的List bookList用Map bookList来实现,这样,所有调用方的程序不得不随着BookList的修改而修改。

四、使用迭代模式的应用

Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:

    1. 访问容器中包含的内部对象
    2.  按顺序访问

类图:

下面是一种比较经典的Iterator模式实现方案,该实现方案基于接口设计原则,设计了以下几个接口或类:
迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。
迭代器实现类:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
容器接口:定义基本功能以及提供类似Iterator iterator()的方法。
容器实现类:容器接口的实现类。必须实现Iterator iterator()方法。

 

Iterator模式的优点:

1,实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
2,隐藏容器的实现细节。
3,为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
4,可以为容器或其子容器实现不同的迭代方法或多个迭代方法。

转载于:https://www.cnblogs.com/LUO77/p/5790093.html

相关文章:

  • hbase rowkey设计的注意事项
  • SQL 必知必会
  • Javascript学习4 - 对象和数组
  • Ubuntu 14.04下安装GitLab指南
  • 黄渊普:媒体视角--O2O与传统零售
  • Makefile学习之make 的运行【转】
  • [原]unity3d刀光剑影(二)
  • C#设计模式之外观
  • MDK调试错误之HardFault_Handler
  • Dom4j
  • Java基础work4
  • NIO入门系列之第9章:字符集
  • 新语言学习
  • Leetcode | Permutations II
  • C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【EOS】Cleos基础
  • extract-text-webpack-plugin用法
  • HTTP中的ETag在移动客户端的应用
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • vue 配置sass、scss全局变量
  • 力扣(LeetCode)965
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 区块链共识机制优缺点对比都是什么
  • 如何进阶一名有竞争力的程序员?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 学习JavaScript数据结构与算法 — 树
  • 用 Swift 编写面向协议的视图
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • elasticsearch-head插件安装
  • Mac 上flink的安装与启动
  • Spring第一个helloWorld
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #define与typedef区别
  • #QT(TCP网络编程-服务端)
  • #在 README.md 中生成项目目录结构
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)共用体union的用法举例
  • (ZT)出版业改革:该死的死,该生的生
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (一)基于IDEA的JAVA基础1
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8.0 发布到 IIS
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net Memory Profiler的使用举例
  • .NET 指南:抽象化实现的基类
  • .Net面试题4