24-迭代器模式
目录
代码示例
<?php
/**
* Description of IteratorDemo
* 迭代器模式
* @author jm
*/
class IteratorDemo
{
//put your code here
public static function main()
{
$string = ["AA","BB","CC","DD","EE","FF"];
$collection = new MyCollection($string);
$it = $collection->iterator();
while ($it->hasNext()){
print_r("下一个是:".$it->next()."\n");
}
}
}
//集合接口
interface ICollection{
public function iterator();
public function get($i);
public function size();
}
//迭代器接口
interface IIterator{
public function previous();
public function next();
public function hasNext();
public function first();
}
//实现集合
class MyCollection implements ICollection{
private $_string = ["A","B","C","D","E","F"];
public function __construct($data)
{
$this->_string = $data;
}
/**
*
* @return \MyIterator
*/
public function iterator(){
return new MyIterator($this);
}
public function get($i){
return $this->_string[$i];
}
public function size(){
return count($this->_string);
}
}
//实现迭代器
class MyIterator implements IIterator{
/**
*
* @var MyCollection
*/
private $_collection = null;
private $_position = -1;
public function __construct($collection)
{
$this->_collection = $collection;
}
public function previous()
{
if($this->_position > 0){
$this->_position--;
}
return $this->_collection->get($this->_position);
}
public function next()
{
if ($this->_position < ($this->_collection->size()-1)) {
$this->_position++;
}
return $this->_collection->get($this->_position);
}
public function hasNext()
{
if ($this->_position < ($this->_collection->size()-1)) {
return true;
}
return false;
}
public function first()
{
$this->_position = 0;
return $this->_collection->get($this->_position);
}
}
IteratorDemo::main();
输出
下一个是:AA
下一个是:BB
下一个是:CC
下一个是:DD
下一个是:EE
下一个是:FF
小结
当你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合内部的结构,又可让外部代码透明地访问集合内部的数据。
本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除
markdown 9ong@TsingChan