讓對象變得可迭代並表現得像對象集合。php
PHP 標準庫 (SPL) 定義了一個最適合此模式的接口迭代器!每每也須要實現 Countable 接口,容許在迭代器對象上使用 count($object) 方法。laravel
<?php namespace DesignPatterns\Behavioral\Iterator; class Book { /** * @var string */ private $author; /** * @var string */ private $title; public function __construct(string $title, string $author) { $this->author = $author; $this->title = $title; } public function getAuthor(): string { return $this->author; } public function getTitle(): string { return $this->title; } public function getAuthorAndTitle(): string { return $this->getTitle().' by '.$this->getAuthor(); } }
<?php namespace DesignPatterns\Behavioral\Iterator; class BookList implements \Countable, \Iterator { /** * @var Book[] */ private $books = []; /** * @var int */ private $currentIndex = 0; public function addBook(Book $book) { $this->books[] = $book; } public function removeBook(Book $bookToRemove) { foreach ($this->books as $key => $book) { if ($book->getAuthorAndTitle() === $bookToRemove->getAuthorAndTitle()) { unset($this->books[$key]); } } $this->books = array_values($this->books); } public function count(): int { return count($this->books); } public function current(): Book { return $this->books[$this->currentIndex]; } public function key(): int { return $this->currentIndex; } public function next() { $this->currentIndex++; } public function rewind() { $this->currentIndex = 0; } public function valid(): bool { return isset($this->books[$this->currentIndex]); } }
<?php namespace DesignPatterns\Behavioral\Iterator\Tests; use DesignPatterns\Behavioral\Iterator\Book; use DesignPatterns\Behavioral\Iterator\BookList; use DesignPatterns\Behavioral\Iterator\BookListIterator; use DesignPatterns\Behavioral\Iterator\BookListReverseIterator; use PHPUnit\Framework\TestCase; class IteratorTest extends TestCase { public function testCanIterateOverBookList() { $bookList = new BookList(); $bookList->addBook(new Book('Learning PHP Design Patterns', 'William Sanders')); $bookList->addBook(new Book('Professional Php Design Patterns', 'Aaron Saray')); $bookList->addBook(new Book('Clean Code', 'Robert C. Martin')); $books = []; foreach ($bookList as $book) { $books[] = $book->getAuthorAndTitle(); } $this->assertEquals( [ 'Learning PHP Design Patterns by William Sanders', 'Professional Php Design Patterns by Aaron Saray', 'Clean Code by Robert C. Martin', ], $books ); } public function testCanIterateOverBookListAfterRemovingBook() { $book = new Book('Clean Code', 'Robert C. Martin'); $book2 = new Book('Professional Php Design Patterns', 'Aaron Saray'); $bookList = new BookList(); $bookList->addBook($book); $bookList->addBook($book2); $bookList->removeBook($book); $books = []; foreach ($bookList as $book) { $books[] = $book->getAuthorAndTitle(); } $this->assertEquals( ['Professional Php Design Patterns by Aaron Saray'], $books ); } public function testCanAddBookToList() { $book = new Book('Clean Code', 'Robert C. Martin'); $bookList = new BookList(); $bookList->addBook($book); $this->assertCount(1, $bookList); } public function testCanRemoveBookFromList() { $book = new Book('Clean Code', 'Robert C. Martin'); $bookList = new BookList(); $bookList->addBook($book); $bookList->removeBook($book); $this->assertCount(0, $bookList); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)shell
面試10家公司,收穫9個offer,2020年PHP 面試問題設計模式
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。服務器
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出併發