[设计模式笔记]三. 行为型模式--18. Iterator模式(迭代器)对象行为型模式(一)

行为型模式--Iterator模式(迭代器)对象行为型模式


一. 意图

    

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


二. 适用性


访问一个聚合对象的内容而无需暴露它的内部表示.

支持对聚合对象的多种遍历(例如顺序遍历list, 倒序遍历list)

为遍历不同的聚合结构提供一个统一的接口(支持多态迭代).(例如顺序遍历中可以遍历list, vector)

这一模式的关键思想是将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器(iterator)对象中迭代器类定义了一个访问该列表元素的接口迭代器对象负责跟踪当前的元素.


三. 模式结构



图1 


四. 角色说明


Iterator(迭代器)

—迭代器定义访问和遍历元素的接口.

ConcreteIterator(具体迭代器)

—具体迭代器实现迭代器接口.

—对该聚合遍历时跟踪当前位置.

-ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象.

Aggregate(聚合)

—聚合定义创建相应迭代器对象的接口.

ConcreteAggregate(具体聚合)(例如list, vector, map)

—具体聚合实现创建相应迭代器的接口该操作返回ConcreteIterator的一个适当的实例.


五. 说明


1. 它支持以不同的方式遍历一个聚合

2. 迭代器简化了聚合的接口. (聚合中就不需要包含遍历相关的接口)

3. 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态因此你可以同时进行多个遍历.

4. 迭代器分内部迭代器和外部迭代器. C++STL中属于外部迭代器它需要客户主动推进遍历的步伐你可以在获得某个聚合对象后做一些事情内部迭代器则有迭代器本身来推动遍历的步伐因为是内部当你需要对聚合对象做一些什么事情时必须在迭代前对迭代器设置好(例如设置一个回调函数指针).

5. 附加的迭代器操作迭代器的最小接口由First, Next, IsDoneCurrentItem操作组成.

6. C++中使用多态的迭代器 它们要求用一个FactoryMethod动态的分配迭代器对象因此仅当必须多态时才使用它们否则使用在栈中分配内存的具体的迭代器多态迭代器有另一个缺点客户必须负责删除它们例如STL中的 list::erace(); Proxy模式提供了一个补救方法我们可使用一个栈分配的Proxy作为实际迭代器的中间代理该代理在其析构器中删除该迭代器这样当该代理生命周期结束时实际迭代器将同它一起被释放即使是在发生异常时该代理机制能保证正确地清除迭代器对象这就是著名的C++“资源分配即初始化”的一个应用.

7. 迭代器可有特权访问 从该模式的结构知道迭代器和聚合紧密耦合.

8. 空迭代器 一个空迭代器(NullIterator)是一个退化的迭代器它有助于处理边界条件.


我的理解:


1. 迭代模式中用得最多的那就是C++STL, list, vector, set, map.

通常我是这么用

struct STStudent

{

             STStudent();

             ~STStudent();

             STStudent(const STStudent& stStudent); // 拷贝构造函数

             STStudent& operator=(const STStudent& stStudent); // 拷贝操作符

             void Release();

             std::string m_strName;

};

typedef std::vector<STStudent*> STStudentVector;                            // STStudent对象数组模板参数是指针

typedef STStudentVector::iterator STStudentVectorIterator;              // 迭代器

typedef STStudentVector::const_iterator STStudentVectorConstIterator; // 常量迭代器.

特别是聚合是一个很大的数据结构/类时模板参数使用指针可以避免过大的拷贝.

typedef std::vector<STStudent> STStudentVector; // 迭代过程中拷贝非常频繁那么sizeof(STStudent)很大时效率会很低.

模板参数是指针的缺点是需要自己手动删除聚合.

可以看到, std::vector怎么存储STStudent*我们并不需要知道我们只使用STStudentVectorIterator就可以完成vector的元素访问这就是Iterator模式的实现目的.

使用

STStudentVector stStudentVector;

...

STStudentVectorIterator iter;

// 这里就是使用外部遍历

for(iter = stStudentVector.begin(); iter = stStudentVector.end(); ++iter);

// 也可以这样

for(int i = 0; i < stStudentVector.size(); ++i);


相关模式


Composite: 迭代器常被应用到象复合这样的递归结构上.

Factory Method: 多态迭代器靠Factory Method来例化适当的迭代器子类

Memento: 常与迭代器模式一起使用迭代器可使用一个memento来捕获一个迭代的状态。迭代器在其内部存储memento



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值