IT技术精粹[JiShuBu.Com]-倾力打造一流IT技术平台!
  • 登录
  • 注册
  • 设为首页
  • 加入收藏
  • 网站首页
  • IT风向标
  • 网站优化
  • Html
  • CSS
  • JavaScript
  • ASP
  • Php/Mysql
  • Flash
  • Ajax
  • 源码下载
  • 精美桌面
  • 供求信息
  • 超稳定100M虚拟主机只要100元,还送50M邮箱!
  • 文字广告招商中...
  • 会员注册 | 用户登录 | 我要投稿
  • 信息订阅
 php设计模式介绍之迭代器模式 您现在正在浏览:首页 > Php/Mysql > 
 php设计模式介绍之迭代器模式

作者:bmli 发布时间:2008-08-24 11:18:11 来源:phpchina

LibraryGofIterator 接收了构造函数中的 $collection, 这一点非常重要(参见上面的 Library 最小化实现)并从 currentItem() 方法返回 current() 项。

class  LibraryGofIterator  {
protected  $collection;
function  __construct($collection)  {
$this->collection  =  $collection;
}
function  currentItem()  {
return  current($this->collection);
}
function  isDone()  {
return  false;
}
}

在下一个迭代会出现什么? next() 方法应该更改currentItem() 方法返回的项。下面的测试捕获了所期望的行为:

class  IteratorTestCase  extends  UnitTestCase  {
function  setup()  {  /*  ...  */  }
function  TestGetGofIterator()  {
$this->assertIsA($it  =  $this->lib->getIterator(),  ‘LibraryGofIterator’);
$this->assertFalse($it->isdone());
$this->assertIsA($first  =  $it->currentItem(),  ‘Media’);
$this->assertEqual(‘name1’,  $first->name);
$this->assertFalse($it->isdone());
$this->assertTrue($it->next());
$this->assertIsA($second  =  $it->currentItem(),  ‘Media’);
$this->assertEqual(‘name2’,  $second->name);
$this->assertFalse($it->isdone());
}
}

重新建立在 PHP 的数组函数之上,在数组上使用 next():

class  LibraryGofIterator  {
protected  $collection;
function  __construct($collection)  {
$this->collection  =  $collection;
}
function  currentItem()  {
return  current($this->collection);
}
function  next()  {
return  next($this->collection);
}
function  isDone()  {
return  false;
}
}

 除了 isDone() 方法必须返回 之外,第三个迭代看起来很像其他的迭代。你还希望 next() 能够成功移到下一个迭代:

class  IteratorTestCase  extends  UnitTestCase  {
function  setup()  {  /*  ...  */  }
function  TestGetGofIterator()  {
$this->assertIsA($it  =  $this->lib->getIterator(),  ‘LibraryGofIterator’);
$this->assertFalse($it->isdone());
$this->assertIsA($first  =  $it->currentItem(),  ‘Media’);
$this->assertEqual(‘name1’,  $first->name);
$this->assertFalse($it->isdone());
$this->assertTrue($it->next());
$this->assertIsA($second  =  $it->currentItem(),  ‘Media’);
$this->assertEqual(‘name2’,  $second->name);
$this->assertFalse($it->isdone());
$this->assertTrue($it->next());
$this->assertIsA($third  =  $it->currentItem(),  ‘Media’);
$this->assertEqual(‘name3’,  $third->name);
$this->assertFalse($it->next());
$this->assertTrue($it->isdone());
}
}

对 next() 和 isDone() 方法稍加修改,所有的测试都通过了。代码如下:

class  LibraryGofIterator  {
protected  $collection;
function  __construct($collection)  {
$this->collection  =  $collection;
}
function  first()  {
reset($this->collection);
}
function  next()  {
return  (false  !==  next($this->collection));
}
function  isDone()  {
return  (false  ===  current($this->collection));
}
function  currentItem()  {
return  current($this->collection);
}
}

迭代器测试用例只存在一个问题:它没有反映迭代器的典型用法。是的,它测试了迭代器模式的所有功能,但应用程序需要采用更简单的方法来使用迭代器。因此,下一步是使用更贴实际的代码来编写测试。

class  IteratorTestCase  extends  UnitTestCase  {
protected  $lib;
function  setup()  {  /*  ...  */  }
function  TestGetGofIterator()  {  /*  ...  */  }
function  TestGofIteratorUsage()  {
$output  =  ‘’;
for  ($it=$this->lib->getIterator();  !$it->isDone();  $it->next()){
$output  .=  $it->currentItem()->name;
}
$this->assertEqual(‘name1name2name3’,  $output);
}
}

目前,迭代器的实现复制了某个数组(集合),并使用 PHP 的内部指针来跟踪迭代。你还可以通过自己跟踪集合索引来实现迭代器。这需要 Library 中的一种新的 accessor 方法来通过关键字访问对象。

class  Library  {
//  ...
function  get($key)  {
if  (array_key_exists($key,  $this->collection))  {
return  $this->collection[$key];
}
}
}

同样,在  Library::getIterator() 方法中,你可能将 $this(library 本身)传递给构造程序,而不是将 $this 传递给集合(数组包含Media 集合)。外部的迭代器然后只是内部地跟踪指针以了解它当前引用的是哪一个 Library 集合元素,并将使用构造行数中从引用到 Library 的传递来检索当前的对象。

class  LibraryGofExternalIterator  {
protected  $key  =  0;
protected  $collection;
function  __construct($collection)  {
$this->collection  =  $collection;
}
function  first()  {
$this->key=0;
}
function  next()  {
return  (++$this->key  <  $this->collection->count());
}
function  isDone()  {
return  ($this->key  >=  $this->collection->count());
}
function  currentItem()  {
return  $this->collection->get($this->key);
}
}

这一实现假设你的集合数组从 0 开始建立索引,并且是完全连续的。

上一页 1 2 3 4 5 6 7 下一页  
【评论】【加入收藏夹】【大 中 小】【打印】【关闭】
※ 相关信息
 · php设计模式介绍之单件模式  (2008-08-24 11:18:23)
 · php设计模式介绍之伪对象模式  (2008-08-24 11:18:11)

发表评论
查看评论 
用户名: 密码:
验证码: 匿名发表
[注册帐号]
[控制面板]
[用户登陆]
[修改资料]
[用户收藏]
[我的状态]
[退出登陆]
 
文章搜索
     
    [添加文章]   [管理文章]
最新技术文档
    ·中国移动188号段将于1月8日起在深圳正式放号
    ·PHP与Javascript的两种交互方式
    ·使用wordpress中的函数 (PHP)
    ·js倒计时效果-精确到秒 (Javascript)
    ·PHP无刷新删除数据
    ·PHP文件系统处理类
    ·PHP文件缓存数据类
    ·PHPMailer邮件类利用smtp.163.com发送邮件方
    ·PHP的POST方式
    ·md5 结合 crypt =无敌密码
技术文档排行榜
    ·天气预报小偷,根据IP自动判断地址
    ·超经典计算机使用问题105答
    ·CSS网页布局入门教程:下拉及多级弹出式菜单
    ·'AjaxPro'未定义错误的原因&javascript顺
    ·[初学者必读]网页制作之HTML基础知识
    ·DIV&CSS打造自动伸展三栏复合布局
    ·近1000本javascript电子图书下载列表
    ·CSS 文字樣式技巧 (摘自一台湾网站,确实很
    ·阿里妈妈广告的投放技巧
    ·ajax+php无刷新二级联动下拉菜单(省市联动)
关于站点 - 广告服务 - 联系我们 - 免责声明 - 程序支持 - 网站地图 - 留言中心 - 返回顶部

Copyright © 2007-2008 www.Jishubu.com online services. All rights reserved. Template designed by laogui.
违法不良信息举报中心 津ICP备07002356号