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

上文:

样本代码

在 Library 内实现 GoF 迭代器模式的第一步是为新的具体迭代器写一个新的测试用例。因为每一种测试方法都将操纵包含 Media 实例的 Library,你可以清空 UnitTestCase::setUp() 方法,从而在每种测试的已知状态下将变量填充到 Library 中。

首先,将 Library::getIterator()  方法作为LibraryGofIterator 类的 一个 Factory 实例。

class  IteratorTestCase  extends  UnitTestCase  {
protected  $lib;
function  setup()  {
$this->lib  =  new  Library;
$this->lib->add(new  Media(‘name1’,  2000));
$this->lib->add(new  Media(‘name2’,  2002));
$this->lib->add(new  Media(‘name3’,  2001));
}

function  TestGetGofIterator()  {
$this->assertIsA($it  =  $this->lib->getIterator()
,’LibraryGofIterator’);
}
}

实现:

class  Library  {
//  ...
function  getIterator()  {
return  new  LibraryGofIterator($this->collection);
}
}

getIterator() 方法将 Library 的 $collection 传递给新的具体迭代器结构。这一方法有两个重要的实现:每个迭代器都是独立的,因此可以同时操作多个迭代器。另外,迭代器在数组上的操作是当迭代器被请求时才执行的。如果之后将另一个项添加到集合中,你必须请求另一个迭代器来显示它(至少是在该实现中)。让我们通过将声明添加到    TestGetGofIterator() 方法以匹配迭代器设计模式,继续对测试进行加强。

如果你已经对整个集合进行遍历,则 isDone() 方法只应该为 true。如果 iterator 刚刚创建,则 isDone() 显然返回 false,从而指出集合可以遍历。

class  IteratorTestCase  extends  UnitTestCase  {
function  setup()  {  /*  ...  */  }
function  TestGetGofIterator()  {
$this->assertIsA($it  =  $this->lib->getIterator()
,’LibraryGofIterator’);
$this->assertFalse($it->isdone());
}
}

与 TDD 一样,尽可能实现最简单的代码来满足你的测试用例:

class  LibraryGofIterator  {
function  isDone()  {
return  false;
}
}

因此,在第一个迭代器间,应该发生什么呢? currentItem() 应该返回第一个 Media 对象,这个对象是在 IteratorTestCase::setUp() 方法中添加的,isDone() 应该继续为 false,因为另两个项仍然等待遍历。

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());
}
}

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

发表评论
查看评论 
用户名: 密码:
验证码: 匿名发表
[注册帐号]
[控制面板]
[用户登陆]
[修改资料]
[用户收藏]
[我的状态]
[退出登陆]
 
文章搜索
     
    [添加文章]   [管理文章]
最新技术文档
    ·十天学会PHP之基础知识
    ·十天学会PHP之流程控制
    ·十天学会PHP之构建数据库
    ·十天学会PHP之连接数据库
    ·echo和print 的区别
    ·PHP生成随机字符串
    ·PHP取得文件后缀
    ·正则表达式经验谈
    ·PHP的Cookie技术介绍
    ·PHP数组排序
技术文档排行榜
    ·天气预报小偷,根据IP自动判断地址
    ·超经典计算机使用问题105答
    ·'AjaxPro'未定义错误的原因&javascript顺
    ·[初学者必读]网页制作之HTML基础知识
    ·DIV&CSS打造自动伸展三栏复合布局
    ·CSS网页布局入门教程:下拉及多级弹出式菜单
    ·阿里妈妈广告的投放技巧
    ·谁是网页浏览器引擎速度真正王者
    ·JavaScript:世界上误解最深的语言
    ·几种常用禁止修改输入框的方法
关于站点 - 广告服务 - 联系我们 - 免责声明 - 程序支持 - 网站地图 - 留言中心 - 返回顶部

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