目录

代码示例

<?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 @TsingChan