设计模式专题(十六)——迭代器模式
(原创内容,转载请注明来源,谢谢)
一、概述
迭代器模式(Iterator)提供一种方法,顺序访问一个聚合对象中的每个元素,而又不暴露该对象的内部表示。当需要访问一个聚集对象,不管这些对象是什么都要遍历,则就要用到迭代器模式。另外,对聚集有多种方式遍历时,也可以用迭代器模式。
迭代器为遍历不同的聚集结构提供了开始入口、访问下一个、判断是否结束、当前某一项内容等的统一接口。foreach就是一个迭代器的体现,其不管传入的数组内部构造,都会逐个遍历数组的元素。
二、类图
三、PHP中的迭代器
PHP中,通常情况下,foreach只能对数组遍历,当需要对类进行遍历,PHP提供了接口,实现接口的类就可以直接用foreach进行遍历。关于此部分内容,有一篇很经典的博客——http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html,里面除了迭代器,还讲了PHP的SPL里面的各中类和接口。
1、Iterator接口
该接口定义了五个方法,包括current、next、key、valid、rewind,需要在current里面实现获取返回当前内容;next里实现循环到下一个元素;key实现获取键的方式;valid实现验证当前键是否有效;rewind实现。
2、IteratorAggregate接口
虽然Iterator接口可以实现对对象属性的遍历,但是很复杂,需要实现五个方法,较为繁琐。因此,PHP还定义了一个迭代器,IteratorAggregate。
继承该接口的类,只需要实现一个方法,getIterator,就可以实现迭代的功能。该方法需要返回另一个PHP内部定义的类Traversable的实例。
在PHP官方文档中已经很清晰的说明如何使用:
<?php
class myData implementsIteratorAggregate {
public $property1 = "Public propertyone";
public $property2 = "Public propertytwo";
public $property3 = "Public propertythree";
public function __construct() {
$this->property4 = "lastproperty";
}
public function getIterator() {
return new ArrayIterator($this);
}
}
$obj = new myData;
foreach($obj as $key=> $value) {
var_dump($key, $value);
echo "\n";
}
?>
这个方法的输出了属性、属性值,如下:
string(9) "property1"
string(19) "Public propertyone"
string(9) "property2"
string(19) "Public propertytwo"
string(9) "property3"
string(21) "Public propertythree"
string(9) "property4"
string(13) "lastproperty"
——written by linhxx 2017.08.14
相关阅读: