php设计模式之迭代器模式

今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。

迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代。

在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口。只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或抽象类。

 
图1 迭代器模式

参与者:

◆客户端(Client):引用迭代器模式的方法在一组值或对象上执行一个循环。

◆迭代器(Iterator):在迭代过程上的抽象,包括next(),isFinished(),current()等方法。

◆具体迭代器(ConcreteIterators):在一个特定的对象集,如数组,树,组合,集合等上实现迭代。

通过Traversable接口,PHP原生态支持迭代器模式,这个接口由Iterator和IteratorAggregate做了扩展,这两个
子接口不仅是定义了一套标准的方法,每个Traversable对象都可以原封不动地传递给foreach(),foreach是迭代器的主要客户
端,Iterator实现是真正的迭代器,而IteratorAggregate是有其它职责的Traversable对象,它通过
getIterator()方法返回一个Iterator。

标准PHP库是PHP中绑定的唯一通用目的面向对象库,定义了额外的接口和公用类。OuterIterator实现装饰一个Iterator,CachingIterator和LimitIterator是这个接口的两个例子。

RecursiveIterator是Iterator接口为树形结构实现的一个扩展,它定义了一组额外的方法检查迭代中当前元素的子对象是否存
在。RecursiveArrayIterator和RecursiveDirectoryIterator是这个接口的实现示例,这些类型的迭代器可以
原样使用,或是用一个RecursiveIteratorIterator桥接到一个普通的迭代器契约。这个OuterIterator实现将会根据构造
参数执行深度优先或广度优先遍历。

使用RecursiveIteratorIterator时,可以将其传递给foreach,请看后面的代码示例,了解
RecursiveIterators的不同用法和它们的超集Iterator。最后,SeekableIterators向契约添加了一个seek()
方法,它可以用于移动Iterator的内部状态到一个特定的迭代点。

注意,迭代器是比对象集更好的抽象,因为我们可以让InfiniteIterators,NoRewindIterators等,不用与普通数组阵列与一致,因此,Iterator缺少count()函数等功能。
在PHP官方手册中可以找到完整的SPL迭代器列表。得益于对PHP的强力支持,使用迭代器模式的大部分工作都包括在标准实现中,下面的代码示例就利用了标准Iterator和RecursiveIterators的功能。

    <?php
    /**
     * Collection that wraps a numeric array.
     * All five public methods are needed to implement
     * the Iterator interface.
     */
    class Collection implements Iterator
    {
        private $_content;
        private $_index = 0;  

        public function __construct(array $content)
        {
            $this->_content = $content;
        }  

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

        public function valid()
        {
            return isset($this->_content[$this->_index]);
        }  

        public function current()
        {
            return $this->_content[$this->_index];
        }  

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

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

    $arrayarray = array(‘A‘, ‘B‘, ‘C‘, ‘D‘);
    echo "Collection: ";
    foreach (new Collection($array) as $key => $value) {
        echo "$key => $value. ";
    }
    echo "\n"; 

    /**
     * Usually IteratorAggregate is the interface to implement.
     * It has only one method, which must return an Iterator
     * already defined as another class (e.g. ArrayIterator)
     * Iterator gives a finer control over the algorithm,
     * because all the hook points of Iterator‘ contract
     * are available for implementation.
     */
    class NumbersSet implements IteratorAggregate
    {
        private $_content;  

        public function __construct(array $content)
        {
            $this->_content = $content;
        }  

        public function contains($number)
        {
            return in_array($number, $this->_content);
        }  

        /**
         * Only this method is necessary to implement IteratorAggregate.
         * @return Iterator
         */
        public function getIterator()
        {
            return new ArrayIterator($this->_content);
        }
    }  

    echo "NumbersSet: ";
    foreach (new NumbersSet($array) as $key => $value) {
        echo "$key => $value. ";
    }
    echo "\n"; 

        // let‘s play with RecursiveIterator implementations
        $it = new RecursiveArrayIterator(array(
            ‘A‘,
            ‘B‘,
            array(
                ‘C‘,
                ‘D‘
            ),
            array(
                array(
                    ‘E‘,
                    ‘F‘
                ),
                array(
                    ‘G‘,
                    ‘H‘,
                    ‘I‘
                )
            )
        ));
        // $it is a RecursiveIterator but also an Iterator,
        // so it loops normally over the four elements
        // of the array.
        echo "Foreach over a RecursiveIterator: ";
        foreach ($it as $value) {
            echo $value;
            // but RecursiveIterators specify additional
            // methods to explore children nodes
            $children = $it->hasChildren() ? ‘{Yes}‘ : ‘{No}‘;
            echo $children, ‘ ‘;
        }
        echo "\n";
        // we can bridge it to a different contract via
        // a RecursiveIteratorIterator, whose cryptic name
        // should be read as ‘an Iterator that spans over
        // a RecursiveIterator‘.
        echo "Foreach over a RecursiveIteratorIterator: ";
        foreach (new RecursiveIteratorIterator($it) as $value) {
            echo $value;
        }
        echo "\n";

转载自 http://developer.51cto.com/art/201004/197287_all.htm

时间: 2024-10-13 01:06:09

php设计模式之迭代器模式的相关文章

【设计模式】——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato

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

1.定义 迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节. 基本上没有人会单独写一个迭代器,除非是产品性质的开发. 2.通用类图 Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素:next()访问下一个元素:isDone()是否已经访问到底部(Java 叫做hasNext()方法). ConcreteIterator具体迭代器:具体迭代器角色要实现迭代器接口,完成容器元素的遍历. Ag

2018.4.30 设计模式之迭代器模式

设计模式之迭代器模式 1.定义/概念 迭代器模式是Java和.Net编程环境中非常常用的设计模式.这种设计模式用于顺序访问集合对象的元素要知道集合对象的底层表示.迭代器模式属于行为型模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.角色和定义 ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

【设计模式】迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JAVA 中的

设计模式之迭代器模式--- Pattern Iterator

模式的定义 迭代器模式定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 类型 行为类 模式的使用场景 方便遍历访问容器内的元素 优点 面向对象设计原则中的单一职责原则,对于不同的功能,我们要尽可能的把这个功能分解出单一的职责,不

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

这篇博客,我们要详细讲解的是迭代器模式(Iterator Pattern),将要讲解的内容有:迭代器模式 的定义,作用,详细设计分析等方面. 一.Pattern name 迭代器模式(Iterator Pattern) : 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示.--<设计模式 可复用面向对象软件的基础> 二.Problem 在我们实际编程的过程中,经常会遇到下面这种情况: 当我们需要遍历某个集合的时候,常常调用某个类的一个方法,返回一个集合类型的数据,如下:

设计模式之迭代器模式(Iterator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

大话设计模式_迭代器模式(Java代码)

迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示 简单描述:提供一个单独的接口遍历聚集类对象中的成员,以实现聚集对象的隐藏和内部数据供外部访问 大话设计模式中的截图: 我觉得以上面的图示进行编码会暴露ConcreteAggregate中的内部信息(ConcreteIerator可以访问聚集类中的成员,那表示其他类也可以和ConcreteIerator一样进行相同的访问),所以我以另外一种形式实现迭代器(即内部类的方式,和Java中的ArrayList类似) 代码