在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
引言:在理解迭代器模式之前,先了解一下迭代器的概念。迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。 概念:迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 迭代器模式的关键思想是:将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器(Iterator)中。 我们可能没有注意到,我们每天都在使用迭代器模式。在PHP开发中,它潜藏在PHP数组类型和各种数组操作类型中。比如在PHP中的本地数组迭代: <?php $arr = array('one','two','three'); $output = ''; reset($arr); do{ $output .= current($arr)."<br/>"; } while(next($arr)); echo $output; reset()函数将迭代重新转到数组的开始,current()返回当前元素的值,next()则前进至数组中的下一个元素并返回新的current()值,当你超出数组的最后一个元素时,next()返回false,使用这些迭代方法,PHP数组的内部实现就与你不相关了。 迭代器结合了封装和多态的面向对象设计原理。使用迭代器,可以对集合中的对象进行操作,而无需专门了解集合如何显现或者集合包含什么(对象的种类)。迭代器提供了不同固定迭代实现的统一接口,完全包含了如何操纵特定集合的详细信息,包括显示哪些项(过滤)及其显示顺序(排序)。 适用性:
角色: Iterator(抽象迭代器):迭代器定义访问和遍历元素的接口 ConcreteIterator(具体迭代器):具体迭代器实现迭代器Iterator接口,对该聚合遍历时跟踪当前位置。 Aggregate(抽象聚合类):聚合定义创建相应迭代器对象的接口 ConcreteAggregate(具体聚合类):替聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
代码示例: \Libs\Aggregate.php <?php namespace Libs; abstract class Aggregate { protected $_objs; protected $_size; public function createIterator() { } public function getItem() { } public function getSize() { return $this->_size; } } \Libs\ConcreteAggregate.php <?php namespace Libs; class ConcreteAggregate extends Aggregate { public function __construct($count) { for($i=0;$i<$count;$i++){ $this->_objs[] = $i; } } public function createIterator() { return new ConcreteIterator($this); } public function getItem($idx=0) { if($idx < $this->getSize()){ return $this->_objs[$idx]; } else { return FALSE; } } public function getSize() { return count($this->_objs); } } \Libs\Iterator.php <?php namespace Libs; abstract class Iterator { protected $_ag; protected $_idx; public function first(){} public function next(){} public function isDone(){} public function currentItem(){} } \Libs\ConcreteIteratorSort.php <?php namespace Libs; class ConcreteIteratorSort extends Iterator { public function __construct($ag,$idx=0) { $this->_ag = $ag; $this->_idx = $idx; } public function first() { $this->_idx = 0; } public function next() { if($this->_idx < $this->_ag->getSize()){ $this->_idx++; } } public function isDone() { if($this->_idx == $this->_ag->getSize()){ return TRUE; } else { return FALSE; } } public function currentItem() { return $this->_ag->getItem($this->_idx); } } \Libs\ConcreteIteratorUnSort.php <?php namespace Libs; class ConcreteIteratorUnSort extends Iterator { public function __construct($ag,$idx=0) { $this->_ag = $ag; $this->_idx = $idx; } public function first() { $this->_idx = $this->_ag->getSize()-1; } public function next() { if($this->_idx >=0){ $this->_idx--; } } public function isDone() { if($this->_idx < 0){ return TRUE; } else { return FALSE; } } public function currentItem() { return $this->_ag->getItem($this->_idx); } }
\Libs\UseIterator.php <?php namespace Libs; class UseIterator { public static function index() { $ag = new ConcreteAggregate(10); $it_sort = new ConcreteIteratorSort($ag); $it_sort->first(); for(;$it_sort->isDone()==FALSE;$it_sort->next()) { echo $it_sort->currentItem().'***'; } echo '<br/>'; $it_unsort = new ConcreteIteratorUnSort($ag); $it_unsort->first(); for(;$it_unsort->isDone()==FALSE;$it_unsort->next()) { echo $it_unsort->currentItem().'***'; } } } 调用代码 IMooc\UseIterator::index(); 结果: 0***1***2***3***4***5***6***7***8***9*** 9***8***7***6***5***4***3***2***1***0***
推荐阅读>> 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) |
2022-08-18
2022-08-17
2022-11-06
2022-08-17
2022-07-29
请发表评论