ホームページ  >  記事  >  バックエンド開発  >  PHP 設計パターン イテレータ パターン

PHP 設計パターン イテレータ パターン

高洛峰
高洛峰オリジナル
2016-11-21 14:13:531154ブラウズ

概念

反復子モード (Iterator)、カーソル (Cursor) モードとも呼ばれます。オブジェクトの内部表現を公開せずに、集合オブジェクト内のさまざまな要素に順次アクセスする方法を提供します。

集約オブジェクトにアクセスする必要があり、それらのオブジェクトが何であるかに関係なく、それを走査する必要がある場合は、反復子パターンの使用を検討する必要があります。さらに、複数の方法でコレクションを走査する必要がある場合は、反復子パターンの使用を検討できます。イテレータ パターンは、開始、次、終了するかどうか、現在の項目など、さまざまなコレクション構造をトラバースするための統一インターフェイスを提供します。適用可能なシナリオの内部表現を公開することなく集約オブジェクトの内容をアクセスするgregate骨材の複数のトラバーサルは、異なる骨材構造をトラバースするための統合インターフェイスを提供します(イテレータ): イテレータは要素にアクセスし、要素を横断するためのインターフェースを定義します

ConcreteIterator (具体的イテレータ): 特定のイテレータはイテレータ インターフェースを実装し、集合体を走査するときに現在の位置を追跡します

Aggregate (集合体) : 集合体は作成するインターフェースを定義します対応する反復子オブジェクト

ConcreteAggregate (具体的な集約): 具象集約は、対応する反復子を作成するインターフェイスを実装します。 この操作は、ConcreteIterator の適切なインスタンスを返します。

コード

コードは次のとおりです:

PHP SPL 反復子インターフェイス。 Iterator とコンテナ インターフェイス IteatorAggragate が提供されています。 ソース コードは次のとおりです。 PHP 設計パターン イテレータ パターン

/**
 * Interface to detect if a class is traversable using &foreach;.
 * @link http://php.net/manual/en/class.traversable.php
 */
interface Traversable {
}

/**
 * Interface to create an external Iterator.
 * @link http://php.net/manual/en/class.iteratoraggregate.php
 */
interface IteratorAggregate extends Traversable {

    /**
     * Retrieve an external iterator
     * @link http://php.net/manual/en/iteratoraggregate.getiterator.php
     * @return Traversable An instance of an object implementing <b>Iterator</b> or
     * <b>Traversable</b>
     * @since 5.0.0
     */
    public function getIterator();
}

/**
 * Interface for external iterators or objects that can be iterated
 * themselves internally.
 * @link http://php.net/manual/en/class.iterator.php
 */
interface Iterator extends Traversable {

    /**
     * Return the current element
     * @link http://php.net/manual/en/iterator.current.php
     * @return mixed Can return any type.
     * @since 5.0.0
     */
    public function current();

    /**
     * Move forward to next element
     * @link http://php.net/manual/en/iterator.next.php
     * @return void Any returned value is ignored.
     * @since 5.0.0
     */
    public function next();

    /**
     * Return the key of the current element
     * @link http://php.net/manual/en/iterator.key.php
     * @return mixed scalar on success, or null on failure.
     * @since 5.0.0
     */
    public function key();

    /**
     * Checks if current position is valid
     * @link http://php.net/manual/en/iterator.valid.php
     * @return boolean The return value will be casted to boolean and then evaluated.
     * Returns true on success or false on failure.
     * @since 5.0.0
     */
    public function valid();

    /**
     * Rewind the Iterator to the first element
     * @link http://php.net/manual/en/iterator.rewind.php
     * @return void Any returned value is ignored.
     * @since 5.0.0
     */
    public function rewind();
}

ここでは、上記の 2 つのインターフェイスを直接実装しています。以下のコードを参照してください。

<?php
header(&#39;Content-type:text/html;charset=utf-8&#39;);
/**
 * 迭代器模式
 */

/**
 * Class ConcreteIterator 具体的迭代器
 */
class ConcreteIterator implements Iterator
{
    private $position = 0;
    private $array = array();

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

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

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

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

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

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

/**
 * Class MyAggregate 聚合容器
 */
class ConcreteAggregate implements IteratorAggregate
{
    public $property;

    /**
     * 添加属性
     *
     * @param $property
     */
    public function addProperty($property)
    {
        $this->property[] = $property;
    }

    public function getIterator()
    {
        return new ConcreteIterator($this->property);
    }
}

/**
 * Class Client 客户端测试
 */
class Client
{
    public static function test()
    {
        //创建一个容器
        $concreteAggregate = new ConcreteAggregate();
        // 添加属性
        $concreteAggregate->addProperty(&#39;属性1&#39;);
        // 添加属性
        $concreteAggregate->addProperty(&#39;属性2&#39;);
        //给容器创建迭代器
        $iterator = $concreteAggregate->getIterator();
        //遍历
        while($iterator->valid())
        {
            $key   = $iterator->key();
            $value = $iterator->current();
            echo &#39;键: &#39;.$key.&#39; 值: &#39;.$value.&#39;<hr>&#39;;
            $iterator->next();
        }

    }
}

Client:: test();

実行結果:

値:属性 1

キー: 1 値: 属性 2

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。