定義:
迭代器模式(Iterator):提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示,
結構:
- Iterator:迭代器介面,用于定義得到開始物件、得到下一個物件、判斷是否到有效、當前物件等抽象方法,統一介面,目前PHP已經集成有該類,
- IteratorAggregate:容器介面,目前PHP已經集成有該類,
- ConcreteAggregate:具體容器類,繼承IteratorAggregate,
- ConcreteIterator:具體迭代器類,繼承Iterator,
- Client:客戶端代碼,
代碼實體:
/** * IteratorAggregate 原始碼 * Interface to create an external Iterator. * @link https://php.net/manual/en/class.iteratoraggregate.php */ interface IteratorAggregate extends Traversable { /** * Retrieve an external iterator * @link https://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(); } /** * Iterator原始碼 * Interface for external iterators or objects that can be iterated * themselves internally. * @link https://php.net/manual/en/class.iterator.php */ interface Iterator extends Traversable { /** * Return the current element * @link https://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 https://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 https://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 https://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 https://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. * @since 5.0.0 */ public function rewind(); } /** * 具體聚集類 * Class ConcreteAggregate */ class ConcreteAggregate implements \IteratorAggregate { private $data = []; /** * 往迭代器里面添加資料 */ public function add($name) { $this->data[] = $name; } /** * 獲取迭代器 * @return ConcreteIterator|\Traversable */ public function getIterator() { // TODO: Implement getIterator() method. return new ConcreteIterator($this->data); } } /** * 具體迭代器類 * Class ConcreteIterator */ class ConcreteIterator implements \Iterator { private $key = 0; private $data = []; public function __construct($data) { $this->data = https://www.cnblogs.com/woods1815/archive/2020/11/24/$data; $this->key = 0; } /** * 回傳當前元素 */ public function current() { // TODO: Implement current() method. return $this->data[$this->key]; } /** * 前進到下一個元素 */ public function next() { // TODO: Implement next() method. return $this->key++; } /** * 回傳當前元素的鍵 */ public function key() { // TODO: Implement key() method. return $this->key; } /** * 檢查當前位置是否有效 */ public function valid() { // TODO: Implement valid() method. return isset($this->data[$this->key]); } /** * 將Iterator倒退到第一個元素 */ public function rewind() { // TODO: Implement rewind() method. return $this->key = 0; } } // 客戶端呼叫 $concreteAggregate = new ConcreteAggregate(); $concreteAggregate->add('張三'); $concreteAggregate->add('李四'); $concreteAggregate->add('王五'); $concreteIterator = $concreteAggregate->getIterator(); foreach ($concreteIterator as $concrete) { echo $concrete . "<br>"; } // 結果 張三 李四 王五
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/227136.html
標籤:其他
