1.概述

类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合。

集合不一定是均一的。图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu、Slider 和 Button。并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列。

例子1:电视遥控器的频道遍历

2.问题

如何操纵任意的对象集合? 

如一个列表(List)或者一个集合(Set),我们又如何提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构?

3.解决方案

迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构。又叫做游标(Cursor)模式 。
你可能没有意识到这一点,但你每天都在使用迭代器模式 。
如在PHP开发中,它潜藏在 PHP 的数组类型和各种数组操作函数中。(其实,给你一些固有类的数组的组合和一群用这些固有类工作的可变函数,你将不得不使用这些数组来处理对象集合。这是在 PHP 中的本地数组迭代:

  1. $test  =  array(‘one’,  ‘two’,  ‘three’);
  2. $output  =  ‘’; reset($test);
  3. do  {
  4. $output  .=  current($test);
  5. }  while  (next($test));
  6. echo  $output;  //  produces  ‘onetwothree’

reset() 函数将迭代重新转到数组的开始;current() 返回当前元素的值;next() 则前进至数组中的下一个元素并返回新的 current() 值。当你超出数组的最后一个元素时,next() 返回 false。使用这些迭代方法,PHP 数组的内部实现就与你不相关了。

迭代器结合了封装和多态的面向对象程序设计原理。使用迭代器,你可以对集合中的对象进行操作,而无需专门了解集合如何显现或者集合包含什么(对象的种类)。迭代器提供了不同固定迭代实现的统一接口,它完全包含了如何操纵特定集合的详细信息,包括显示哪些项(过滤)及其显示顺序(排序)。

4.适用性

迭代器模式可用来:

• 访问一个聚合对象的内容而无需暴露它的内部表示。
• 需要为聚合对象提供多种遍历方式。
• 为遍历不同的聚合结构提供一个统一的接口 (即, 支持多态迭代)

5.结构

结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符号“单一职责原则”。

注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代

6.模式的组成

抽象迭代器(Iterator): 迭代器定义访问和遍历元素的接口。
具体迭代器(ConcreteIterator):  具体迭代器实现迭代器Iterator接口。对该聚合遍历时跟踪当前位置。
抽象聚合类(Aggregate): 聚合定义创建相应迭代器对象的接口。
具体聚合类(ConcreteAggregate): 体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

7.效果

•迭代器模式的作用:

1 ) 它支持以不同的方式遍历一个聚合对象 : 复杂的聚合可用多种方式进行遍历。迭代器模式使得改变遍历算法变得很容易 : 仅需用一个不同的迭代器的实例代替原先的实例即可。你也可以自己定义迭代器的子类以支持新的遍历。
2) 迭代器简化了聚合的接口 有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。这样就简化了聚合的接口。
3) 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态。因此你可以同时进行多个遍历。

4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。
迭代器模式的缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

8.实现

我们直接实现spl的iterator:

  1. <?php
  2. /**
  3. * 具体迭代器(ConcreteIterator):  具体迭代器实现迭代器Iterator接口。对该聚合遍历时跟踪当前位置。
  4. */
  5. class  ConcreteIterator implements  Iterator {
  6. protected $_key;
  7. protected $_collection;
  8. public function __construct($collection){
  9. $this->_collection = $collection;
  10. $this->_key = 0;
  11. }
  12. public function rewind(){
  13. $this->_key = 0;
  14. }
  15. public function valid(){
  16. return isset($this->_collection[$this->_key]);
  17. }
  18. public function key(){
  19. return $this->_key;
  20. }
  21. public function current(){
  22. return $this->_collection[$this->_key];
  23. }
  24. public function next(){
  25. return ++$this->_key;
  26. }
  27. }
  28. /**
  29. * 具体聚合类(ConcreteAggregate):
  30. */
  31. class ConcreteAggregate implements IteratorAggregate{
  32. protected $_arr;
  33. public function __construct($array){
  34. $this->_arr = $array;
  35. }
  36. public function getIterator(){
  37. return new    ConcreteIterator($this->_arr);
  38. }
  39. }
  40. $_collectionay = array(1,2,3,3,4);
  41. $it = new ConcreteIterator($_collectionay);
  42. foreach($it as $key=>$value){
  43. echo $key.':'.$value.'<br/>';
  44. }

9.与其他相关模式

Composite :迭代器常被应用到象复合这样的递归结构上。
Factory Method:多态迭代器靠Factory Method来例化适当的迭代器子类。
Memento:常与迭代器模式一起使用。迭代器可使用一个 Memento来捕获一个迭代的状态。迭代器在其内部存储Memento。

10.总结与分析

1)聚合是一个管理和组织数据对象的数据结构。
2)聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
3)存储数据是聚合对象最基本的职责。
4)将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
参考:http://blog.csdn.net/hguisu/article/details/7552841

设计模式(十五):Iterator迭代器模式 -- 行为型模式相关推荐

  1. Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式

    Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...

  2. 转:中国互联网十五年的22个创新模式

    中国互联网十五年的22个创新模式     今天,看网上有人推荐<沸腾十五年>,讲中国互联网从发源到现今. 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什 ...

  3. 中国互联网十五年的22个创新模式

    中国互联网十五年的22个创新模式 作者: meng分类:坊间人语  阅读:198,032 次添加评论 今天,看网上有人推荐<沸腾十五年>,讲中国互联网从发源到现今. 有人有如此梳理,自己本 ...

  4. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  5. java设计模式(十五)——迭代器模式

    学院展示项目需求: 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 传统的设计方案(类图) 问题分析:  将学院看做是学校 ...

  6. 设计模式十五:行为型-命令模式

    行为型模式:命令模式 文章目录 行为型模式:命令模式 命令模式 1.命令模式:介绍 2.命令模式:模拟场景 3.命令模式:代码实现 4.命令模式:总结 命令模式 1.命令模式:介绍 命令模式 把逻辑实 ...

  7. 设计模式十八:mediator(中介者模式)——对象行为型模式

    mediator(中介者模式)--对象行为型模式 1.意图 用一个中介对象来封装一系列的对象交互.中介者使不同对象不需要显式地相互引用,从而使其松散耦合,从而使得可以独立地改变他们之间的交互. 2.动 ...

  8. C++设计模式之工厂模式(创建型模式)

    学习软件设计,向OO高手迈进! 设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案. 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来 ...

  9. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

最新文章

  1. linux系统怎么关闭usb端口,linux系统挂载以及卸载USB接口的设备的解决办法
  2. python好吗-老男孩学习python好吗?
  3. NTU课程笔记 :CV6422(4) sampling process
  4. Android加速度传感器
  5. python3框架的rf_pythonRF框架
  6. 机器学习基础-弹性网 Elastic Net-08
  7. hierarchy change in CRM - step2 outbound R3AUIBASE queue
  8. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
  9. php cookie防伪造,技术分享:Cookie 防伪造 防修改
  10. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析
  11. KB954430补丁重复安装失败的解决办法
  12. Android系统移植与调试之-------如何修改Android手机显示的4G信号强度的格子数
  13. 先科机顶盒一直出现android,网络电视机顶盒停留在开机界面,无法开机的解决办法...
  14. cad填充转多段线脚本
  15. nn棋盘放n个皇后java_帮忙解决一道大学c++题八皇后问题。在一个8*8的国际象棋盘,有八个皇后,每个皇后占一格:要求棋盘上放上八个皇后是不出现...
  16. 还记得那些老国手吗? 07
  17. Vue.js :使用LODOP打印表格文件
  18. easyRL蘑菇书阅读笔记(一)
  19. MathType中如何批量修改公式字体和大小
  20. 计算机毕业设计springboot基于web的数码产品应用平台设计与实现

热门文章

  1. 什么叫双核、四核、八核?
  2. 法总统:英国若“无协议脱欧” 将成最大输家
  3. LinkedList源码(基础代码)
  4. docker搭建gitlab
  5. mysql删除有空格字符名称的触发器
  6. 分布式系统理论之两阶段提交协议
  7. 79期:Faceu的分布式数据库实战访谈
  8. centOS 7 安装man中文版手册
  9. Cheat—— 给Linux初学者和管理员一个终极命令行备忘单
  10. (C#)AJAX post方式传值