迭代器模式允许用户通过特定的顺序访问容器中的数据;
它将数据和顺序的实现分离;
迭代器模式属于设计模式中的没落贵族;
单独实现迭代器的场景很少了;
比如 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
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
最新评论