设计模式之迭代器模式–foreach循环的原理
迭代器模式
是迭代,循环,一般在语言层面都实现了。
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
为什么要使用迭代器模式
因为要循环啊,总有循环遍历的需求,所以就要使用迭代器模式了。
不过这些语言都内置了,比如foreach
这种。那么foreach是怎么实现可以遍历的呢?
php实现迭代器模式
迭代器主要就是一个一个循环,那么需要有下一个的方法,也就是next
,有下一个就需要判断是否可以循环,那么要有一个hasNext
方法。
首先定义一个接口
/**
* 迭代器模式
* 迭代器接口
*/
interface Iterator{
function next();
function hasNext();
}
然后实现一个迭代器,继承这个接口
/**
* 迭代器模式
* 迭代器接口
*/
class Iterate implements Iterator{
private $arr = [];
private $current = 0;
function __construct(Array $arr) {
$this->arr = $arr;
}
/**
* 获取下一个元素
*/
function next() {
$value = null;
if ($this->hasNext()) {
$value = $this->arr[$this->current];
$this->current++;
}
return $value;
}
/**
* 判断是否有下一个元素
*/
function hasNext() {
return $this->current < count($this->arr) ? true : false;
}
}
客户端使用
$arr= [1,2,3];
$iterator = new iterator($arr);
while($iterator->hasNext()) {
dump($iterator->next());
}
dump('foreach实现');
foreach($arr as $value) {
dump($value);
}
可以看到和foreach
的效果一模一样了。这就是迭代器模式,不过php已经有iterator这个接口了。
代码放在了我的github上面。