ITERATOR(迭代器)设计模式
1 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2 别名(Cursor)
3 动机:队列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中。
多态迭代
抽象的列表类,提供列表的公共接口。类似的也需要一个抽象的Iterator,公共的迭代接口。
列表对象提供CreateIterator(是Factory Method)
4 适用性:
.访问聚合对象内容而无需暴露它的内部表示
.支持该聚合对象的多种遍历
.为遍历不同的聚合结构提供一个统一的接口(支持多台迭代)
5 参与者:
Iterator:定义访问和遍历元素的接口
ConcreteIterator:具体迭代器实现迭代的接口。对聚合遍历时跟踪当前位置。
Aggregate:聚合定义创建相应迭代器对象的接口
ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
6 ConcreteIterator 跟踪聚合中的当前对象,能计算出遍历的后继对象。
7 效果:
1)支持不同的方式遍历一个聚合
2)简化了聚合的接口
3)同一个聚合上可以有多个遍历
8 实现:
1)谁控制迭代
客户控制迭代时,外部迭代器。客户主动请求下一个元素
迭代器控制迭代时,内部迭代器。客户只需要指定一个有待执行的操作
2)谁定义算法遍历:
3)迭代器的健壮程度如何:
遍历迭代器的同时更改迭代器是危险的。
4)附加迭代的操作
5)C++中使用多台的迭代器:
要求使用Factory Method动态分配迭代器对象。缺点:客户必须删除迭代器。
Proxy提供了一个补救方法。可以使用一个栈分配的Proxy作为实际迭代器的代理。在Proxy的析构函数里删除迭代器。
6)迭代器可有特权访问:
迭代器作为聚合的友元,这样就是紧密的耦合。
特权遍历使得生成新的遍历很困难,因为要求聚合增加友元。
解决办法,迭代器类包含protected操作访问聚合类的重要的非公共可见的成员,迭代器子类可使用protected操作得到聚合的特权访问。
7)用于复合对象的迭代器:
Composite模式,使用内部迭代器更方便一些。
如果复合对象有一个接口从一个节点移到父节点、兄弟节点或子节点,那么基于游标的迭代器更好。
8)空迭代器:
NullIterator是一个退化的迭代器,有助于处理外部边界。
ITERATOR(迭代器)设计模式的更多相关文章
- Design Pattern Iterator 迭代器设计模式
这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- 使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...
- 设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- 【转】Java学习之Iterator(迭代器)的一般用法 (转)
[转]Java学习之Iterator(迭代器)的一般用法 (转) 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭 ...
- 用C# (.NET Core) 实现迭代器设计模式
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...
- ES6笔记(6)-- Set、Map结构和Iterator迭代器
系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...
- vector容器+iterator迭代器
关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm 关于iterator迭代器的描述,可参考http://www.cppblog.c ...
随机推荐
- 递归,动态规划,找最短路径,Help Jimmy
题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...
- apache-common pool的使用
Apache commons-pool本质上是"对象池",即通过一定的规则来维护对象集合的容器;commos-pool在很多场景中,用来实现"连接池"/&quo ...
- sqlserver2008安装教程
这几天因为需要,一直想安装sql server 2008来作为Web后台的数据库进行些实验,但总是没有时间,今天终于有时间了,便安装了SQL Server 2008,以下是我的安装的步骤,希望对于有需 ...
- JS中的call()和apply()方法和bind()
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- FTP协议标准命令
FTP:文件传输协议(File Transfer Protocol) 文件传输协议(FTP)使得主机间可以共享文件.FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连 ...
- webkit和xcode
一.webkit下载地址:https://svn.webkit.org/repository/webkit/ 它的总大小为2.75G 二.xcode下载地址:http://adcdownload.ap ...
- hahaha
[问题描述] 小Q对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目: 首先,小Q会在x轴正半轴和y轴正半轴分别挑选n个点.随后,他将轴的点 ...
- ecshop商品分类页获取相册列表方法
第1步:找到根目录的category.php文件,查找约:486行左右(注意这不是准确位置,看实际的哦),找到这个函数: /** * 获得分类下的商品 * * @access public * @pa ...
- redis基本数据类型及方法
redis支持的数据类型 String redis最基本的类型,可以是任意类型的字符串,也可以是数字 SET 赋值,用法: SET key value GET 取值,用法: GET key INCR ...
- 分分钟知道tiles框架是干嘛的
分分钟知道tiles框架是干嘛的 http://blog.sina.com.cn/s/blog_a123d4d50101792d.html参考上面的文章,简单明了.让你一下子就知道这个是用来做什么的. ...