迭代器模式(Iterator)
是一种对象行为型模式,使用频率很高。
有点类似于把数组转变成单个字符串的过程。
输出结果:
最常见的使用就是通过遍历功能把数据从聚合对象中分离出来。
迭代器也是操作聚合对象的基本手段,包括的方法有:获取第一个元素的First(),访问下一个元素的Next(),判断是否还有下一个元素的IsExist(),获取当前元素的currentItem()。
包含一个抽象迭代器和一个具体迭代器,代码如下:
<?php echo "<pre>"; // 迭代器模式 index.php header("Content-Type:text/html;charset=utf-8"); require_once "Iterator.php"; echo "-------------------数组-------------------<br/>"; // 构建数组 $arr = array("one","two","three"); print_r($arr); // 传值进迭代器 $iterator = new ConcreteIterator($arr); echo "------------------第一个数-----------------<br/>"; // 取出第一个数 echo $iterator->First()."<br/>"; echo "------------------遍历输出-----------------<br/>"; // 剥离数组 循环输出 while (!$iterator->IsExist()) { <span style="white-space:pre;"> </span>// 输出当前数据 <span style="white-space:pre;"> </span>echo "{$iterator->CurrentItem()}<br/>"; // 指到下个数据 <span style="white-space:pre;"> </span>$iterator->Next(); }
<?php // 抽象迭代器 abstract Class IIterator { /** * 获取第一个元素 * @access public */ abstract function First(); /** * 访问下一个元素 * @access public */ abstract function Next(); /** * 判断是否还有下一个元素 * @access public */ abstract function IsExist(); /** * 获取当前元素 * @access public */ abstract function currentItem(); } // 具体迭代器 Class ConcreteIterator extends IIterator { /** * 数据数组 * @var array */ private $aggre; /** * 游标(数组下标) * @var int */ private $curr = 0; /** * 构造方法 * @access public * @param array $_aggre 数组值 */ function __construct($_aggre) { $this->aggre = $_aggre; } /** * 获取第一个元素方法 * @access public */ function First() { return $this->aggre[0]; } /** * 获取下一个元素方法 * @access public */ function Next() { $this->curr++; if($this->curr<count($this->aggre)) { return true; } return false; } /** * 检测存在值方法 * @access public */ function IsExist() { return $this->curr>=count($this->aggre)?true:false; } /** * 获取当前数据方法 * @access public */ function currentItem() { return $this->aggre[$this->curr]; } }
输出结果:
-------------------数组------------------- Array ( [0] => one [1] => two [2] => three ) ------------------第一个数----------------- one ------------------遍历输出----------------- one two three