PHP面向对象进阶设计模式:迭代器模式使用实例
迭代器设计模式可以帮助构造特定对象,那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据。
迭代器模式问题与解决方案:
迭代器设计模式帮助样式对象处理数据或其他对象的集合。创建基于迭代器设计模式的类时,为了提供管理这些集合的统一方式,我们还会创建一组接口。
有些时候,数据集似乎十分简单。编程人员肯能无法预计将会发生变化的情景,因此他们选择不修改代码和不创建迭代器。调用数据库时经常会出现这样的情况。此时,编程人员创建了MySQL查询,随后会执行简单的取数组命令。但是,在代码中保留这样的程序性方式并不是最佳的解决方案。
处理MySQL结果集时应当创建迭代器对象。比较简单的做法是为类构造函数提供一个MySQL查询,然后通过调用迭代器对象的公共方法遍历循环结果集。更复杂的迭代器示例可能还具有要发送给迭代器的其他参数,根据这些条件,就可能执行不同的MySQL查询集。不过无论如何,外部的代码流只通过处理相同烦人公共方法来获取集合中的下一个项。
处理需要遍历的可计数数据时,最佳的解决方案是创建一个基于迭代器模式的对象。
UML
该图详细说明了一个使用迭代器设计模式的类设计。
下面是对上图的说明:
1.MyObject是能够收集入可技数集合的基对象。MyObject具有一个名为name的私有字符串,这个字符串用于代表特定对象的唯一性。公共方法getName()提供了通过私有名name检索对象名称的接口。
2.MyObjectCollection表示一个管理MyObject对象集合的类。MyObjects数组容纳这些对象的集合。getMyObjects()提供的逻辑被用于创建集合和在MyObjects数组中存储对象。
3.MyObjectCollectionIterator提供了对MyObjectCollection中存储的对象进行迭代的接口。这个类具有两个公共方法。其中,hasNext()方法使调用程序知道MyObjects的MyObjectCollection集合中是否还有其他项:getNext()方法会返回MyObjectCollection中数组内的下一个MyObject对象。
使用实例
这个例子展示了使用 foreach 时,迭代器方法的调用顺序。
<?php class myIterator implements Iterator { private $position = 0; private $array = array( "firstelement", "secondelement", "lastelement", ); public function __construct() { $this->position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); } } $it = new myIterator; foreach($it as $key => $value) { var_dump($key, $value); echo "\n"; } ?>
以上就是PHP面向对象进阶设计模式:迭代器模式使用实例的详细内容,更多请关注其它相关文章!