php设计模式(二十)迭代器模式

迭代器模式允许用户通过特定的顺序访问容器中的数据;
它将数据和顺序的实现分离;
迭代器模式属于设计模式中的没落贵族;
单独实现迭代器的场景很少了;
比如 php 官方都提供了迭代器
这篇文章是为了设计模式而写设计模式;

结构

Container: 容器接口 定义获取迭代器的方法 示例中指 ContainerInterface;
ConcreteContainer: 实现 Container 接口的具体容器类 示例中指 NameContainer ;
Iterator: 迭代器接口 这里定义了 hasNext 和 next 方法 示例中指 IteratorInterface;
ConcreteIterator: 实现 Iterator 接口的具体迭代器类 示例中指 NameIterator;

示例

ContainerInterface.php

<?php

namespace Baijunyao\DesignPatterns\Iterator;

/**
 * 容器接口
 *
 * @package Baijunyao\DesignPatterns\Iterator
 */
interface ContainerInterface
{
    /**
     * 增加一个名字
     *
     * @param $name
     *
     * @return mixed
     */
    public function add($name);

    /**
     * 获取迭代器
     *
     * @return mixed
     */
    public function getIterator();
}

NameContainer.php

<?php

namespace Baijunyao\DesignPatterns\Iterator;

/**
 * 姓名容器
 *
 * @package Baijunyao\DesignPatterns\Iterator
 */
class NameContainer implements ContainerInterface
{
    /**
     * @var array
     */
    protected $nameArray = [];

    /**
     * 增加一个名字
     *
     * @param $name
     *
     * @return mixed|void
     */
    public function add($name)
    {
        $this->nameArray[] = $name;
    }

    /**
     * 获取迭代器
     *
     * @return \Baijunyao\DesignPatterns\Iterator\NameIterator|mixed
     */
    public function getIterator()
    {
        return new NameIterator($this->nameArray);
    }
}

IteratorInterface.php

<?php

namespace Baijunyao\DesignPatterns\Iterator;

/**
 * 迭代器接口
 *
 * @package Baijunyao\DesignPatterns\Iterator
 */
interface IteratorInterface
{
    /**
     * 判断是否还有下一个
     *
     * @return mixed
     */
    public function hasNext();

    /**
     * 获取下一个
     *
     * @return mixed
     */
    public function next();
}

NameIterator.php

<?php

namespace Baijunyao\DesignPatterns\Iterator;

/**
 * 姓名迭代器
 *
 * @package Baijunyao\DesignPatterns\Iterator
 */
class NameIterator implements IteratorInterface
{
    /**
     * @var array
     */
    protected $nameArray = [];

    /**
     * @var int
     */
    protected $index = 0;

    /**
     * NameIterator constructor.
     *
     * @param $nameArray
     */
    public function __construct($nameArray)
    {
        $this->nameArray = $nameArray;
    }

    /**
     * 判断是否还有下一个姓名
     *
     * @return bool|mixed
     */
    public function hasNext()
    {
        return $this->index < count($this->nameArray);
    }

    /**
     * 下一个姓名
     *
     * @return mixed|void
     */
    public function next()
    {
        if ($this->hasNext()) {
            echo $this->nameArray[$this->index] . '<br>';
            $this->index++;
        }
    }
}

index.php

<?php

namespace Baijunyao\DesignPatterns\Iterator;

require __DIR__.'/../vendor/autoload.php';

/**
 * 客户端
 *
 * Class Client
 * @package Baijunyao\DesignPatterns\Iterator
 */
class Client
{
    /**
     * 运行
     */
    public function run()
    {
        $nameContainer = new NameContainer();
        $nameContainer->add('张三');
        $nameContainer->add('李四');
        $nameContainer->add('王麻子');

        $nameIterator = $nameContainer->getIterator();

        while ($nameIterator->hasNext()) {
            echo $nameIterator->next();
        }
    }
}

$client = new Client();
$client->run();

当然正如开始所说;
在世界上最好的语言中;
根本不需要这么麻烦;
直接使用内置的迭代器即可;

github示例:https://github.com/baijunyao/design-patterns/tree/master/Iterator

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共2条评论
白俊遥博客

CARPE DIEM :你开发用的是什么软件,需要转什么插件可以生成UML类图

2018-12-20 15:36:57 回复

白俊遥博客

崔荣志 :请先登录后发表评论白俊遥博客

2018-12-01 06:46:53 回复