迭代器是很重要的设计模式

迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。

各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。

PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT.纽约娱乐城

对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.

而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。

view source

print?

01 <?php
02  
03 /**
04 * Iterator模式的简单实现类
05 */
06 class sample implements Iterator {
07     private $_items ;
08  
09     public function __construct(&$data) {
10         $this->_items = $data;
11     }
12     public function current() {
13         return current($this->_items);
14     }
15  
16     public function next() {
17         next($this->_items);  
18     }
19  
20     public function key() {
21         return key($this->_items);
22     }
23  
24     public function rewind() {
25         reset($this->_items);
26     }
27  
28     public function valid() {                                                                             
29         return ($this->current() !== FALSE);
30     }
31 }
32  
33 /** DEMO */
34 $data = array(1, 2, 3, 4, 5);
35 $sa = new sample($data);
36 foreach ($sa AS $key => $row) {
37     echo $key, ‘ ‘, $row, ‘<br />‘;
38 }
39  
40 ?>

举几个迭代器的使用范围:

  1. 使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
  2. 无法在一次的调用获取容器的所有元素时
  3. 要处理数量巨大的无素时(数据库中的表以GB计的数据)
  4. ……

不同的迭代器有不同的接口,例如PHP SPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。

一般是使用foreach来使用迭代器,下面整理了一下代码:

view source

print?

01 <?php  
02 class sample implements Iterator
03 {
04     private $_items = array(1,2,3,4,5,6,7);
05  
06     public function __construct() {
07                   ;//void
08     }
09     public function rewind() { reset($this->_items); }
10     public function current() { return current($this->_items); }
11     public function key() { return key($this->_items); }
12     public function next() { return next($this->_items); }
13     public function valid() { return ( $this->current() !== false ); }
14 }
15  
16 $sa = new sample();
17 foreach($sa as $key => $val){
18     print $key . "=>" .$val;
19 }
20 ?>

while循环也可以:

view source

print?

1 <?php
2 while ($itertor->valid()){//判断是不是最后元素
3     $element=$itertor->current();//获取当前元素
4     $itertor->next();//移动到下一个元素
5 }
6 ?>

为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。

时间: 2024-10-12 21:17:42

迭代器是很重要的设计模式的相关文章

关于很简单的设计模式,ui-dao-database,以及JavaBean和util工具类

关于很简单的设计模式,ui-dao-database,以及JavaBean和util工具类 24. 三 / J2EE / 没有评论 简单的j2ee设计模式, UI通过DAO层访问数据库或者xml文档,数据库返回的数据通过JavaBean 封装,JavaBean是实体类是数据库中表的映射. dao层,数据持久层 JavaBean   数据传送对象,实体类. 其他的公共类 图中是基本的设计模式,和如何建立相应的包. 简单的例子: student实体类对应表中的字段 dao层,增删改查 调用DAO层方

三分钟掌握“迭代器模式”——轻松搞定设计模式

迭代器模式的官方定义: 迭代器模式提供了一种方法,它能够顺序访问一个集合对象中的各个元素,并且又不暴露该对象的内部结构. 不使用迭代器模式实现容器的迭代: 当我们拿到一个含有集合的对象时,如果我们想要遍历对象中的集合,就必须要知道对象的内部结构,然后使用for循环遍历对象中的集合.而且当我们需要换一种遍历方式的时候(如:顺序遍历换成逆序遍历),需要修改客户端的代码,这就违背了"封闭-开放原则".但如果使用了迭代器模式之后,需要换迭代方式时,只需要增加一个迭代器类,然后稍微修改一下集合对

折腾Java设计模式之迭代器模式

迭代器模式 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种不公示其底层细节(结构)的情况下能顺序访问聚合对象元素的方法. 其实在java体系中,jdk已经引入了迭代器接口以及对于的容器接口等.就拿迭代器中的角色,在java中找出其对应的类. 具体角色 (1)迭代器角色(Iterator):定义遍

设计模式 3 —— 迭代器和组合模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式 概要 设计模式 3 -- 迭代器和组合模式

认识设计模式

什么是设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样. 如果一个问题反复发生,那么这个问题的解决方案就会被有效使用,这种被频繁使用的解决方案就叫做模式.设计模式是语言独立(开发语言)的,主要用来解决面向对象设计的一般问题.当你设计一

设计模式开篇

/** * 设计模式四要素: * 1. 模式名称 * 2. 问题 * 3. 解决方案 * 4. 效果 * 设计模式分为三种类型: * 1. 创建型模式: * 1.1 简单工厂模式 * 1.2 工厂模式 * 1.3 抽象工厂模式 * 1.4 单例模式 * 1.5 原型模式 * 1.6 建造者模式 * 2. 结构型模式: * 2.1 适配器模式 * 2.2 桥接模式 * 2.3 装饰模式 * 2.4 组合模式 * 2.5 外观模式 * 2.6 享元模式 * 2.7 代理模式 * 3. 行为型模式:

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

转_设计模式大杂烩

http://www.cnblogs.com/zuoxiaolong/p/pattern26.html 迄今为止,LZ已经将24种设计模式介绍完了,其中包括GOF23种设计模式以及简单工厂模式,这些设计模式之间并不是完全独立的,而是互相之间,会有一些相同的影子,下面我们来一起总结下这24种设计模式. 模式分类 & 传送门 & 对比维度说明 设计原则:  设计模式(总纲) 创建型:  单例模式   简单工厂模式   工厂方法模式   抽象工厂模式  建造者模式  原型模式 结构型:  代理模

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de