PHP設計模式之迭代器模式
来源:互联网 发布:好布业软件 编辑:程序博客网 时间:2024/06/06 07:52
在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(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的功能。
- <?php
- /**
- * Collection that wraps a numeric array.
- * All five public methods are needed to implement
- * the Iterator interface.
- */
- class Collection implements Iterator
- {
- private $_content;
- private $_index = 0;
- public function __construct(array $content)
- {
- $this->_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";
原文名:Practical Php Patterns: Iterator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns
- PHP設計模式之迭代器模式
- PHP設計模式之调解者模式
- PHP設計模式之代理模式
- PHP設計模式之責任鏈模式
- PHP设计模式漫谈之迭代器模式
- PHP设计模式之迭代器模式(Iterator)
- php中的设计模式之--迭代器模式
- php设计模式之迭代器模式
- PHP设计模式漫谈之迭代器模式
- php设计模式之迭代器模式
- PHP 设计模式之迭代器模式
- PHP 設計模式
- PHP之URL模式
- php之工厂模式
- Php设计模式之【迭代器模式Iterator Pattern】
- PHP草根论之设计模式-迭代器模式
- php 设计模式之 代理模式,适配器模式,外观模式
- PHP设计模式中之装饰模式
- volatile
- Netty 简单样例分析(io传输的框架)
- android联系人信息的存储结构
- java读取配置Properties文件
- ffmpeg使用
- PHP設計模式之迭代器模式
- 面试训练字符串子串问题
- js判断浏览器
- Memcache的问题集
- 使用Ant构建web项目 从编译到测试 生成测试报告 打包 邮件发送 远程下载tomcat 部署运行一条龙服务之ant脚本
- MFC--框架封装
- activity的runOnUiThread方法使用
- (转)缘何上市慢?白色手机背后你不知道的事
- 不能打开chm文档的解决办法