博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php设计模式之迭代器模式
阅读量:5047 次
发布时间:2019-06-12

本文共 4684 字,大约阅读时间需要 15 分钟。

今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。

迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代。

在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口。只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或抽象类。

 

图1 迭代器模式

参与者:

◆客户端(Client):引用迭代器模式的方法在一组值或对象上执行一个循环。

◆迭代器(Iterator):在迭代过程上的抽象,包括next(),isFinished(),current()等方法。

◆具体迭代器(ConcreteIterators):在一个特定的对象集,如数组,树,组合,集合等上实现迭代。

通过Traversable接口,PHP原生态支持迭代器模式,这个接口由Iterator和IteratorAggregate做了扩展,这两个 子接口不仅是定义了一套标准的方法,每个Traversable对象都可以原封不动地传递给foreach(),foreach是迭代器的主要客户 端,Iterator实现是真正的迭代器,而IteratorAggregate是有其它职责的Traversable对象,它通过 getIterator()方法返回一个Iterator。

标准PHP库是PHP中绑定的唯一通用目的面向对象库,定义了额外的接口和公用类。OuterIterator实现装饰一个Iterator,CachingIterator和LimitIterator是这个接口的两个例子。

RecursiveIterator是Iterator接口为树形结构实现的一个扩展,它定义了一组额外的方法检查迭代中当前元素的子对象是否存 在。RecursiveArrayIterator和RecursiveDirectoryIterator是这个接口的实现示例,这些类型的迭代器可以 原样使用,或是用一个RecursiveIteratorIterator桥接到一个普通的迭代器契约。这个OuterIterator实现将会根据构造 参数执行深度优先或广度优先遍历。

使用RecursiveIteratorIterator时,可以将其传递给foreach,请看后面的代码示例,了解 RecursiveIterators的不同用法和它们的超集Iterator。最后,SeekableIterators向契约添加了一个seek() 方法,它可以用于移动Iterator的内部状态到一个特定的迭代点。

注意,迭代器是比对象集更好的抽象,因为我们可以让InfiniteIterators,NoRewindIterators等,不用与普通数组阵列与一致,因此,Iterator缺少count()函数等功能。

在PHP官方手册中可以找到完整的SPL迭代器列表。得益于对PHP的强力支持,使用迭代器模式的大部分工作都包括在标准实现中,下面的代码示例就利用了标准Iterator和RecursiveIterators的功能。

_content = $content; } public function rewind() { $this->_index = 0; } public function valid() { return isset($this->_content[$this->_index]); } public function current() { return $this->_content[$this->_index]; } public function key() { return $this->_index; } public function next() { $this->_index++; } } $arrayarray = array('A', 'B', 'C', 'D'); echo "Collection: "; foreach (new Collection($array) as $key => $value) { echo "$key => $value. "; } echo "\n"; /** * Usually IteratorAggregate is the interface to implement. * It has only one method, which must return an Iterator * already defined as another class (e.g. ArrayIterator) * Iterator gives a finer control over the algorithm, * because all the hook points of Iterator' contract * are available for implementation. */ class NumbersSet implements IteratorAggregate { private $_content; public function __construct(array $content) { $this->_content = $content; } public function contains($number) { return in_array($number, $this->_content); } /** * Only this method is necessary to implement IteratorAggregate. * @return Iterator */ public function getIterator() { return new ArrayIterator($this->_content); } } echo "NumbersSet: "; foreach (new NumbersSet($array) as $key => $value) { echo "$key => $value. "; } echo "\n"; // let's play with RecursiveIterator implementations $it = new RecursiveArrayIterator(array( 'A', 'B', array( 'C', 'D' ), array( array( 'E', 'F' ), array( 'G', 'H', 'I' ) ) )); // $it is a RecursiveIterator but also an Iterator, // so it loops normally over the four elements // of the array. echo "Foreach over a RecursiveIterator: "; foreach ($it as $value) { echo $value; // but RecursiveIterators specify additional // methods to explore children nodes $children = $it->hasChildren() ? '{Yes}' : '{No}'; echo $children, ' '; } echo "\n"; // we can bridge it to a different contract via // a RecursiveIteratorIterator, whose cryptic name // should be read as 'an Iterator that spans over // a RecursiveIterator'. echo "Foreach over a RecursiveIteratorIterator: "; foreach (new RecursiveIteratorIterator($it) as $value) { echo $value; } echo "\n";

转载自 

转载于:https://www.cnblogs.com/timelesszhuang/p/4415982.html

你可能感兴趣的文章
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Equal Sides Of An Array
查看>>
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>