極簡設計模式-迭代器模式

long2ge發表於2021-12-10

定義

提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示。

設計的原則和思想

  1. 解耦使用者和集合類物件。
  2. 不變部分是迭代器,變化部分是集合物件。
  3. 核心思想是讓物件能像陣列一樣能遍歷。

一句話概括設計模式

遍歷物件。

結構中包含的角色

  1. Iterator(抽象迭代器)
  2. ConcreteIterator(具體迭代器)
  3. IteratorAggregate(抽象聚合類)
  4. ConcreteIteratorAggregate(具體聚合類)

最小可表達程式碼

// 抽象迭代器
abstract class AbstractIterator implements Iterator
{
    private $position = 0; // 遊標
    private $objects = [];

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

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

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

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

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

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

// 具體迭代器
class ConcreteIterator extends AbstractIterator{}

// 具體聚合類
class ConcreteIteratorAggregate implements IteratorAggregate 
{
    private $objects;

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

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

$objects = ['張3', '李4'];
$aggregate = new ConcreteIteratorAggregate($objects);
foreach ($aggregate->getIterator() as $key => $value) {
    var_dump($key, $value);
} 

優點

  1. 支援遍歷一個聚合物件。
  2. 在同一個聚合上可以有多個遍歷。
  3. 增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
  4. 可以暫停遍歷並在需要時繼續。

缺點

  1. 增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
  2. 迭代器比直接遍歷的效率低。
  3. 抽象迭代器的設計難度較大,需要充分考慮到系統將來的擴充套件.

何時使用

  1. 為一個聚合物件提供多種遍歷方式(訪問集合元素的方法)而無須暴露它的內部表示。
  2. 如果你希望程式碼能夠遍歷不同的甚至是無法預知的資料結構, 可以使用迭代器模式。

實際應用場景

  1. Laravel的Collection類
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章