设计模式详解:Iterator(迭代器)

Iterator 迭代器

设计模式学习:概述

意图

提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

一个所谓的聚合对象,也就是用某种数据结构组合起来的一堆数据的集合。对这种对象的操作必定要涉及对单独某个元素的访问和处理。比如,对于一个数组聚合对象,一定有关于这个数组元素增删改的操作。

但是,处于维护系统良好封装性的目的,设计者当然不希望将自己数据结构太详细地暴露在客户方,这同时也会增加客户操作的难度。另一方面,大家也都不希望这一聚合对象中充斥着太多遍历方式的接口:对于客户而言这使得这一对象操作起来更为麻烦,而设计者这一方也更加难以维护。更重要的一点是:设计者也很难预见到所有对这一结构操作的方式。

于是,迭代器模式应运而生:它能够帮助设计者以一种较简单,但又能够满足客户需要,更重要的是,不破坏系统封装性的方法为使用者提供一系列接口,这些接口能够满足使用者所有的需求。

稳定-变化的观点来看,迭代器封装了数据结构的具体实现。因此即使程序员之后要对这种数据结构进行升级或改造,也不会影响使用者通过迭代器来访问元素。在访问方式稳定的情况下,聚合对象本身能够在一定范围内进行升级加工。

代码案例

几乎每种语言都会提供一套良好的数据结构给它的使用者,而几乎所有这些现成的数据结构都离不开迭代器的帮助。Java 容器包里的各种数据结构用过的都说好,而C++ STL作为这种高级语言直接提供数据结构的先祖,迭代器的使用则更为显著。

迭代器也有很多种类,所谓随机访问迭代器双向迭代器单向迭代器。当然,也有一些不支持迭代器的特殊结构。这些种类基本取决于数据结构本身特性,下面是对于C++中常用结构的总结:

容器 迭代器功能
vector 随机访问
deque 随机访问
list 双向
set/multiset 双向
map/multimap 双向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器

随机访问迭代器允许你以某一种方式访问到聚合对象中的任何一个元素,双向迭代器只允许你以正向或反向依次访问,而单向迭代器,顾名思义,只能选择正向和反向其中一种。

解释

掌握使用迭代器使得你可以轻松的使用这些前人已经写好几乎完美的数据结构,当然,自己设计的系统中也难免要有一些数据聚合的设计。那么作为该数据结构的设计者,为调用者提供良好完整的接口可以为维护同事间的良好关系起到重要作用。

总结

设计模式 Iterator(迭代器)
稳定点: 访问方式稳定
变化点: 数据结构的具体实现方式
效果: 为聚合对象在不破坏封装性的情况下提供完整的访问接口
特点: 数据结构访问方式的简化
调用
Client
Aggregate
Iterator
ConcreteAggregateA
ConcreteAggregateB
IteratorA
IteratorB

2021.3.6转载请标明出处

猜你喜欢

转载自blog.csdn.net/natrick/article/details/114449681
今日推荐