Heim > php教程 > php手册 > PHP设计模式之迭代器模式(Iterator)

PHP设计模式之迭代器模式(Iterator)

WBOY
Freigeben: 2016-06-06 20:01:21
Original
1394 Leute haben es durchsucht

迭代器模式为聚合对象的元素提供一种顺序访问的方式,又能让访问者不必关心聚合对象内部的内部实现。实际上我们平常使用最多的数组foreach操作就是在使用迭代器(注意:迭代器并不等于迭代器模式)。从PHP 5.3开始,PHP开始内置了Iterator接口,为我们实现迭

      迭代器模式为聚合对象的元素提供一种顺序访问的方式,又能让访问者不必关心聚合对象内部的内部实现。实际上我们平常使用最多的数组foreach操作就是在使用迭代器(注意:迭代器并不等于迭代器模式)。从PHP 5.3开始,PHP开始内置了Iterator接口,为我们实现迭代器模式提供了便利:


//PHP5提供的Iterator接口,Traversable接口只是为了标识对象是否可以通过foreach迭代,不包含任何方法
Iterator extends Traversable {
    /* Methods */
    abstract public mixed current ( void )
    abstract public scalar key ( void )
    abstract public void next ( void )
    abstract public void rewind ( void )
    abstract public boolean valid ( void )
}
Nach dem Login kopieren

        也许你会觉得很奇怪(或多余),对于PHP来说,数组本身就是支持迭代的,我们为什么还要通过迭代器模式多封装一层呢?这就是模式定义的核心所在了:让访问者不必关心聚合对象的内部实现(比如元素数量、KEY、具体结构等);相对来说就是让聚合对象的内部实现不暴露给访问者(例如避免对象被访问者修改)。

实现我们自己的迭代器:

class RecordIterator implements Iterator{
    private $position = 0;

    //注意:被迭代对象属性是私有的
    private $records = array();  

    public function __construct(Array $records) {
        $this->position = 0;
        $this->records = $records;
    }

    function rewind() {
        $this->position = 0;
    }

    function current() {
        return $this->records[$this->position];
    }

    function key() {
        return $this->position;
    }

    function next() {
        ++$this->position;
    }

    function valid() {
        return isset($this->records[$this->position]);
    }
}

//假如我们从MongoDB中读取得到下列数据
$data = array(
    0 => array('field' => 'value'),
    1 => array('field' => 'value'),
    2 => array('field' => 'value'),
    3 => array('field' => 'value'),
);

//使用我们自己定义的迭代器
$records = new RecordIterator($data);
while($records->valid()){
    print_r($records->current());
    $records->next();
}
$records->rewind();
Nach dem Login kopieren

在GoF定义的迭代器模式中,还有两个参与者:容器和具体容器,负责初始化并返回具体的迭代器。


//容器
interface Aggregate
{
    public getIterator();
}

//具体容器
class RecordList implements Aggregate{
    private $iterator;

    public function __construct($data){
        $this->iterator = new RecordIterator($data);
    }

    public function getIterator(){
        return $this->iterator;
    }
}

//使用
//假如我们从MongoDB中读取得到下列数据
$data = array(
    0 => array('field' => 'value'),
    1 => array('field' => 'value'),
    2 => array('field' => 'value'),
    3 => array('field' => 'value'),
);
$recordList = new RecordList($data);
$iterator = $recordList->getIterator();
while($iterator->valid()){
    print_r($iterator->current());
    $iterator->next();
}
Nach dem Login kopieren



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage