国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP設(shè)計(jì)模式之迭代器模式

陸斌 / 1101人閱讀

摘要:概念迭代器模式,又叫做游標(biāo)模式。另外,當(dāng)需要對(duì)聚集有多種方式遍歷時(shí),可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結(jié)構(gòu)提供如開始下一個(gè)是否結(jié)束當(dāng)前哪一項(xiàng)等統(tǒng)一的接口。

概念

迭代器模式(Iterator),又叫做游標(biāo)(Cursor)模式。提供一種方法順序訪問一個(gè)聚合對(duì)象中的各種元素,而又不暴露該對(duì)象的內(nèi)部表示。

當(dāng)你需要訪問一個(gè)聚合對(duì)象,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候,就應(yīng)該考慮使用迭代器模式。另外,當(dāng)需要對(duì)聚集有多種方式遍歷時(shí),可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結(jié)構(gòu)提供如開始、下一個(gè)、是否結(jié)束、當(dāng)前哪一項(xiàng)等統(tǒng)一的接口。

適用場(chǎng)景

訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示

支持對(duì)聚合對(duì)象的多種遍歷

為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口

UML圖

角色

Iterator(迭代器):迭代器定義訪問和遍歷元素的接口

ConcreteIterator(具體迭代器):具體迭代器實(shí)現(xiàn)迭代器接口,對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置

Aggregate (聚合): 聚合定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口

ConcreteAggregate (具體聚合):具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例

代碼

代碼如下:

PHP SPL中已經(jīng)提供了迭代器接口Iterator和容器接口IteatorAggragate,其源碼如下:

/**
 * 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 Iterator or
     * Traversable
     * @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();
}

這里我們直接實(shí)現(xiàn)上面兩個(gè)接口,請(qǐng)看下面代碼:

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 客戶端測(cè)試
 */
class Client
{
    public static function test()
    {
        //創(chuàng)建一個(gè)容器
        $concreteAggregate = new ConcreteAggregate();
        // 添加屬性
        $concreteAggregate->addProperty("屬性1");
        // 添加屬性
        $concreteAggregate->addProperty("屬性2");
        //給容器創(chuàng)建迭代器
        $iterator = $concreteAggregate->getIterator();
        //遍歷
        while($iterator->valid())
        {
            $key   = $iterator->key();
            $value = $iterator->current();
            echo "鍵: ".$key." 值: ".$value."
"; $iterator->next(); } } } Client:: test();

運(yùn)行結(jié)果:

鍵: 0 值: 屬性1
鍵: 1 值: 屬性2

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22074.html

相關(guān)文章

  • PHP基礎(chǔ)

    摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...

    HtmlCssJs 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • PHP SplObjectStorage對(duì)象存儲(chǔ)

    摘要:類實(shí)現(xiàn)了對(duì)象存儲(chǔ)映射表,應(yīng)用于需要唯一標(biāo)識(shí)多個(gè)對(duì)象的存儲(chǔ)場(chǎng)景。在之前僅能存儲(chǔ)對(duì)象,之后可以針對(duì)每個(gè)對(duì)象添加一條對(duì)應(yīng)的數(shù)據(jù)。實(shí)際上他們并沒有直接的關(guān)系。 1. 定義 php.net上的定義 The SplObjectStorage class provides a map from objects to data or, by ignoring data, an object set. ...

    cpupro 評(píng)論0 收藏0
  • PHP迭代和生成

    摘要:生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置缺點(diǎn)生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵儯善饔肋h(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無法后退或前進(jìn)。 一.迭代器 分析:想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背單一職責(zé)原則,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開,兩者可獨(dú)立發(fā)展...

    sanyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

陸斌

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<