为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第11天 设计模式之迭代器模式

标签:
PHP 设计模式

课程名称:大话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) "喜洋洋"
 */

课程收获

开始一直不太明白这个模式的真正作用,就反复看还是不明白,就去看别的,找别的资料。所以,看不懂的就先算了,看看别的或者明天再看。。。

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消