Jadual Kandungan
1、模式定义
2、UML类图
3、示例代码
Book.php
BookList.php
BookListIterator.php
BookListReverseIterator.php
4、测试代码
Tests/IteratorTest.php
Rumah pembangunan bahagian belakang tutorial php PHP 设计模式系列 -- 迭代器模式(Iterator)

PHP 设计模式系列 -- 迭代器模式(Iterator)

Jun 20, 2016 pm 12:41 PM

1、模式定义

迭代器模式 (Iterator),又叫做游标(Cursor)模式。提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。

当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

PHP标准库(SPL)中提供了迭代器接口 Iterator,要实现迭代器模式,实现该接口即可。

2、UML类图

3、示例代码

Book.php

<?phpnamespace DesignPatterns\Behavioral\Iterator;class Book{    private $author;    private $title;    public function __construct($title, $author)    {        $this->author = $author;        $this->title = $title;    }    public function getAuthor()    {        return $this->author;    }    public function getTitle()    {        return $this->title;    }    public function getAuthorAndTitle()    {        return $this->getTitle() . ' by ' . $this->getAuthor();    }}
Salin selepas log masuk

BookList.php

<?phpnamespace DesignPatterns\Behavioral\Iterator;class BookList implements \Countable{    private $books;    public function getBook($bookNumberToGet)    {        if (isset($this->books[$bookNumberToGet])) {            return $this->books[$bookNumberToGet];        }        return null;    }    public function addBook(Book $book)    {        $this->books[] = $book;    }    public function removeBook(Book $bookToRemove)    {        foreach ($this->books as $key => $book) {            /** @var Book $book */            if ($book->getAuthorAndTitle() === $bookToRemove->getAuthorAndTitle()) {                unset($this->books[$key]);            }        }    }    public function count()    {        return count($this->books);    }}
Salin selepas log masuk

BookListIterator.php

<?phpnamespace DesignPatterns\Behavioral\Iterator;class BookListIterator implements \Iterator{    /**     * @var BookList     */    private $bookList;    /**     * @var int     */    protected $currentBook = 0;    public function __construct(BookList $bookList)    {        $this->bookList = $bookList;    }    /**     * Return the current book     * @link http://php.net/manual/en/iterator.current.php     * @return Book Can return any type.     */    public function current()    {        return $this->bookList->getBook($this->currentBook);    }    /**     * (PHP 5 >= 5.0.0)<br/>     * Move forward to next element     * @link http://php.net/manual/en/iterator.next.php     * @return void Any returned value is ignored.     */    public function next()    {        $this->currentBook++;    }    /**     * (PHP 5 >= 5.0.0)<br/>     * 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.     */    public function key()    {        return $this->currentBook;    }    /**     * (PHP 5 >= 5.0.0)<br/>     * 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.     */    public function valid()    {        return null !== $this->bookList->getBook($this->currentBook);    }    /**     * (PHP 5 >= 5.0.0)<br/>     * Rewind the Iterator to the first element     * @link http://php.net/manual/en/iterator.rewind.php     * @return void Any returned value is ignored.     */    public function rewind()    {        $this->currentBook = 0;    }}
Salin selepas log masuk

BookListReverseIterator.php

<?phpnamespace DesignPatterns\Behavioral\Iterator;class BookListReverseIterator implements \Iterator{    /**     * @var BookList     */    private $bookList;    /**     * @var int     */    protected $currentBook = 0;    public function __construct(BookList $bookList)    {        $this->bookList = $bookList;        $this->currentBook = $this->bookList->count() - 1;    }    /**     * Return the current book     * @link http://php.net/manual/en/iterator.current.php     * @return Book Can return any type.     */    public function current()    {        return $this->bookList->getBook($this->currentBook);    }    /**     * (PHP 5 >= 5.0.0)<br/>     * Move forward to next element     * @link http://php.net/manual/en/iterator.next.php     * @return void Any returned value is ignored.     */    public function next()    {        $this->currentBook--;    }    /**     * (PHP 5 >= 5.0.0)<br/>     * 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.     */    public function key()    {        return $this->currentBook;    }    /**     * (PHP 5 >= 5.0.0)<br/>     * 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.     */    public function valid()    {        return null !== $this->bookList->getBook($this->currentBook);    }    /**     * (PHP 5 >= 5.0.0)<br/>     * Rewind the Iterator to the first element     * @link http://php.net/manual/en/iterator.rewind.php     * @return void Any returned value is ignored.     */    public function rewind()    {        $this->currentBook = $this->bookList->count() - 1;    }}
Salin selepas log masuk

4、测试代码

Tests/IteratorTest.php

<?phpnamespace DesignPatterns\Behavioral\Iterator\Tests;use DesignPatterns\Behavioral\Iterator\Book;use DesignPatterns\Behavioral\Iterator\BookList;use DesignPatterns\Behavioral\Iterator\BookListIterator;use DesignPatterns\Behavioral\Iterator\BookListReverseIterator;class IteratorTest extends \PHPUnit_Framework_TestCase{    /**     * @var BookList     */    protected $bookList;    protected function setUp()    {        $this->bookList = new BookList();        $this->bookList->addBook(new Book('Learning PHP Design Patterns', 'William Sanders'));        $this->bookList->addBook(new Book('Professional Php Design Patterns', 'Aaron Saray'));        $this->bookList->addBook(new Book('Clean Code', 'Robert C. Martin'));    }    public function expectedAuthors()    {        return array(            array(                array(                    'Learning PHP Design Patterns by William Sanders',                    'Professional Php Design Patterns by Aaron Saray',                    'Clean Code by Robert C. Martin'                )            ),        );    }    /**     * @dataProvider expectedAuthors     */    public function testUseAIteratorAndValidateAuthors($expected)    {        $iterator = new BookListIterator($this->bookList);        while ($iterator->valid()) {            $expectedBook = array_shift($expected);            $this->assertEquals($expectedBook, $iterator->current()->getAuthorAndTitle());            $iterator->next();        }    }    /**     * @dataProvider expectedAuthors     */    public function testUseAReverseIteratorAndValidateAuthors($expected)    {        $iterator = new BookListReverseIterator($this->bookList);        while ($iterator->valid()) {            $expectedBook = array_pop($expected);            $this->assertEquals($expectedBook, $iterator->current()->getAuthorAndTitle());            $iterator->next();        }    }    /**     * Test BookList Remove     */    public function testBookRemove()    {        $this->bookList->removeBook($this->bookList->getBook(0));        $this->assertEquals($this->bookList->count(), 2);    }}
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

11 skrip pemendek URL terbaik PHP (percuma dan premium) 11 skrip pemendek URL terbaik PHP (percuma dan premium) Mar 03, 2025 am 10:49 AM

11 skrip pemendek URL terbaik PHP (percuma dan premium)

Bekerja dengan Data Sesi Flash di Laravel Bekerja dengan Data Sesi Flash di Laravel Mar 12, 2025 pm 05:08 PM

Bekerja dengan Data Sesi Flash di Laravel

Bina aplikasi React dengan hujung belakang Laravel: Bahagian 2, React Bina aplikasi React dengan hujung belakang Laravel: Bahagian 2, React Mar 04, 2025 am 09:33 AM

Bina aplikasi React dengan hujung belakang Laravel: Bahagian 2, React

Respons HTTP yang dipermudahkan dalam ujian Laravel Respons HTTP yang dipermudahkan dalam ujian Laravel Mar 12, 2025 pm 05:09 PM

Respons HTTP yang dipermudahkan dalam ujian Laravel

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Mar 14, 2025 am 11:42 AM

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST

12 skrip sembang php terbaik di codecanyon 12 skrip sembang php terbaik di codecanyon Mar 13, 2025 pm 12:08 PM

12 skrip sembang php terbaik di codecanyon

Pemberitahuan di Laravel Pemberitahuan di Laravel Mar 04, 2025 am 09:22 AM

Pemberitahuan di Laravel

Pengumuman Penyiasatan Situasi PHP 2025 Pengumuman Penyiasatan Situasi PHP 2025 Mar 03, 2025 pm 04:20 PM

Pengumuman Penyiasatan Situasi PHP 2025

See all articles