课程名称:大话PHP设计模式
课程章节:迭代器模式
课程讲师:Rango
课程内容:
为什么要使用迭代器模式?
- 迭代器模式是针对于集合对象而生的,既然是集合对象,就设计到遍历,但在一个对象内部要给其添加遍历的操作就让这个对象承担了太多的责任了,而面向对象设计原则之一就是单一职责原则。所以要把遍历的职责交给迭代器,集合对象实现迭代器的接口就好了
我对于为什么要使用迭代器模式的理解
- 看了教程还是不理解迭代器模式在具体项目中的应用场景,在必应上搜索,看到这篇文章后,我认为迭代器模式不是位了解决项目中的实际为题,而是为了实现面向对象设计原则中的单一职责原则,是为了解决其它设计思想中的问题而提供的一种解决方案。
代码
该实例中的
Imooc\Loader.php
文件为框架加载文件,不是策略模式中的文件
-
代码目录结构
-
Imooc/AllData.php
<?php
namespace Imooc;
// Iterator是PHP中迭代器实现的接口,它有5个抽象方法
class AllData implements \Iterator
{
private $detail = [];
// 使用index变量记录下标
private $index;
public function __construct()
{
// 这个模拟的就是要被迭代器遍历的集合
$this->detail = [
'小明', '小红', '丹尼', '珍妮', '佩奇', '喜洋洋'
];
}
// 返回当前迭代的元素
public function current()
{
return $this->detail[$this->index];
}
// 让下标加一
public function next()
{
$this->index++;
}
// 返回当前的下标
public function key()
{
return $this->index;
}
// 返回是否还有下一个元素
public function valid()
{
return $this->index < count($this->detail);
}
// 重置下标
public function rewind()
{
$this->index = 0;
}
}
- Imooc/Loader.php
<?php
namespace Imooc;
class Loader
{
static public function autoload($class) {
require BASEDIR . '/' . str_replace('\\', '/', $class) . '.php';
}
}
- index.php
<?php
define('BASEDIR', __DIR__);
include BASEDIR . '/Imooc/Loader.php';
spl_autoload_register('\\Imooc\\Loader::autoload');
// 这里就可以把实例化后的AllData类当做一个集合对象来遍历了,使用foreach来遍历
$data = new \Imooc\AllData;
foreach ($data as $k=>$v) {
var_dump($v);
}
/** 输出:
string(6) "小明"
string(6) "小红"
string(6) "丹尼"
string(6) "珍妮"
string(6) "佩奇"
string(9) "喜洋洋"
*/
课程收获
开始一直不太明白这个模式的真正作用,就反复看还是不明白,就去看别的,找别的资料。所以,看不懂的就先算了,看看别的或者明天再看。。。