面向对象的洗礼:设计模式(二十)之迭代器模式
迭代器模式,将一个列表从头到尾或者从尾到头进行一次遍历。迭代器模式是被提名要求废除的一种设计模式。因为很多的高级语言,如PHP,Python,JAVA等,都已经拥有了foreach。
迭代器模式:提供一种方法顺序,来访问一个聚合中的各个元素,而不暴露该对象的内部表示。
迭代器模式用来访问一个列表的第一个,最后一个,或者某一个的下一个。
以PHP为代码环境模拟一下迭代器模式的思想。抽象一个Iterator类的理由是有可能是正序,有可能倒序查找。
<?php abstract class Iterator{ public function first(){ } public function last(){ } } //正序 class PositiveOrder extends Iterator{ private $list; private $listTmp; public function __construct($list){ $this->list = $list; $this->listTmp = array_values($list); } public function first(){ return $this->listTmp[0]; } public function last(){ return $this->listTmp[(count($this->listTmp)-1)]; } } //倒序 class ReverseOrder extends Iterator{ private $list; private $listTmp; public function __construct($list){ $this->list = $list; $this->listTmp = array_values($list); } public function first(){ return $this->listTmp[(count($this->listTmp)-1)]; } public function last(){ return $this->listTmp[0]; } }
我们还可以去模拟获取某个元素的下一个元素等。
在PHP中,活跃社区的各个开发者都在为PHP的明天做贡献,为我们提供了已经封装好的函数,用来操作PHP数组的内部指针。
next(); 定位指针到当前位置的后一个 prev(); 定位指针到当前位置的前一个 reset(); 重置指针到数组的开始 end(); 定位指针到数组的最后 current(); 取得当前指针位置的值 key(); 取得当前指针位置的键
使用示例:
<?php $arr=array("php"=>"脚本","python"=>"脚本","mysql"=>"数据库"); while(list($key,$value)=each($arr)){ echo $key.'============>'.$value.'<br>'; } /** * 输出结果 * php============>脚本 * python============>脚本 * mysql============>数据库 */ reset($arr); while(list($key,$value)=each($arr)){ echo $key.'============>'.$value.'<br>'; } /** * 输出结果 * php============>脚本 * python============>脚本 * mysql============>数据库 */ reset($arr); next($arr); while(list($key,$value)=each($arr)){ echo $key.'============>'.$value.'<br>'; } /** * 输出结果 * python============>脚本 * mysql============>数据库 */ end($arr); echo current($arr).'=============>'.key($arr).'<br>'; /** * 输出结果 * mysql============>数据库 */ prev($arr); echo current($arr).'=========>'.key($arr).'<br>'; /** * 输出结果 * python============>脚本 */