极简设计模式-迭代器模式

迭代器模式 - Iterator Pattern

定义

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。

设计的原则和思想

  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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!