您的位置: 首页 > 技术文档 > 网络编程 > php设计模式介绍之迭代器模式
一个月的php学习总结 回到列表 php设计模式介绍之策略模式
 php设计模式介绍之迭代器模式

作者:bmli 时间: 2008-07-26 文档类型:合作网站提供 来自:phpchina

第 1 页 php设计模式介绍之迭代器模式 [1]
第 2 页 php设计模式介绍之迭代器模式 [2]
第 3 页 php设计模式介绍之迭代器模式 [3]
第 4 页 php设计模式介绍之迭代器模式 [4]
第 5 页 php设计模式介绍之迭代器模式 [5]
第 6 页 php设计模式介绍之迭代器模式 [6]
第 7 页 php设计模式介绍之迭代器模式 [7]
第 8 页 php设计模式介绍之迭代器模式 [8]

上文:《PHP设计模式介绍》第七章 策略模式

《PHP设计模式介绍》第八章 迭代器模式

 类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合。

属性来自 SQL 查询的一组数据就是一个集合,就像本书前面章节介绍的 Monopoly 游戏示例的对象列表。

集合不一定是均一的。图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu、Slider 和 Button。并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列。

问题

如何操纵任意的对象集合?

解决方案

使用迭代器模式来提供对集合内容的统一存取。

你可能没有意识到这一点,但你每天都在使用迭代器模式 - 它潜藏在 PHP 的数组类型和各种数组操作函数中。(其实,给你一些固有类的数组的组合和一群用这些固有类工作的可变函数,你将不得不使用这些数组来处理对象集合。这是在 PHP 中的本地数组迭代:

$test  =  array(‘one’,  ‘two’,  ‘three’);
$output  =  ‘’; reset($test);
do  {
$output  .=  current($test);
}  while  (next($test));
echo  $output;  //  produces  ‘onetwothree’

reset() 函数将迭代重新转到数组的开始;current() 返回当前元素的值;next() 则前进至数组中的下一个元素并返回新的 current() 值。当你超出数组的最后一个元素时,next() 返回 false。使用这些迭代方法,PHP 数组的内部实现就与你不相关了。迭代器结合了封装和多态的面向对象程序设计原理。使用迭代器,你可以对集合中的对象进行操作,而无需专门了解集合如何显现或者集合包含什么(对象的种类)。迭代器提供了不同固定迭代实现的统一接口,它完全包含了如何操纵特定集合的详细信息,包括显示哪些项(过滤)及其显示顺序(排序)。

让我们创建一个简单的对象,在数组中对它进行操作。(尽管该示例在 PHP5 环境下,但迭代器并不特定于 PHP5。虽然添加了较多的引用操作符,本章节中的大多数示例在 PHP4 下也能够运行)。对象 Lendable 表示诸如电影、相册等媒体,它作为 web 站点的一部分或服务,允许用户浏览或将他们的媒体集合分享给其他用户。(对        于该示例,请无需考虑其他方面。)让我们开始下面对 Lendable 基础设计的测试。

//  PHP5
class  LendableTestCase  extends  UnitTestCase  {
function  TestCheckout()  {
$item  =  new  Lendable;
$this->assertFalse($item->borrower);
$item->checkout(‘John’);
$this->assertEqual(‘borrowed’,  $item->status);
$this->assertEqual(‘John’,  $item->borrower);
}
function  TestCheckin()  {
$item  =  new  Lendable;
$item->checkout(‘John’);
$item->checkin();
$this->assertEqual(‘library’,  $item->status);
$this->assertFalse($item->borrower);
}
}

要实现这一最初测试的需求,我们来创建一个带有若干公共属性和一些方法的类,来触发这些属性的值:

class  Lendable  {
public  $status  =  ‘library’;
public  $borrower  =  ‘’;
public  function  checkout($borrower)  {
$this->status  =  ‘borrowed’;
$this->borrower  =  $borrower;
}
public  function  checkin()  {
$this->status  =  ‘library’;
$this->borrower  =  ‘’;
}
}

Lendable 是一个好的,普通的开端。让我们将它扩展到诸如 DVD 或 CD 的磁道项。媒体扩展了 Lendable,并且磁道详细记录了特定媒体的详细信息,包括项目的名称,发布的年份以及项本身的类型:

class  Media  extends  Lendable  {
public  $name; public  $type; public  $year;
public  function  __construct($name,  $year,  $type=’dvd’ )  {
$this->name  =  $name;
$this->type  =  $type;
$this->year  =  (int)$year;
}
}

要使事情更加简单,媒体有三个公共的实例变量,Media::name,Media::year 和Media::type。构造函数采用了两个参数,将第一个存储在 $name 中,第二个存储在 $year 中。构造函数还允许可选的第三个参数来指定类型(缺省为dvd)。

给定单独的对象来操作,你现在可以创建一个容器来包含他们:Library。类似于常用的库,Library 应该能够添加,删除和计算集合中的项。甚至,Library 还应该允许访问集合(本章中的样本代码部分可看到示例)中的单一的项(对象)。

我们开始构建 Library 的测试用例。

class  LibraryTestCase  extends  UnitTestCase  {
function  TestCount()  {
$lib  =  new  Library;
$this->assertEqual(0,  $lib->count());
}
}

它是满足这一测试的简单类:

class  Library  {
function  count()  {
return  0;
}
}

继续将一些有趣的功能添加到测试中:

class  LibraryTestCase  extends  UnitTestCase  {
function  TestCount()  {  /*  ...  */  }
function  TestAdd()  {
$lib  =  new  Library;
$lib->add(‘one’);
$this->assertEqual(1,  $lib->count());
}
}

实现 add() 的简单方法是建立在 PHP 灵活数组函数的基础上:你可以将项添加到实例变量并使用 count() 来返回集合众项的数量。

class  Library  {
protected  $collection  =  array();
function  count()  {
return  count($this->collection);
}
function  add($item)  {
$this->collection[]  =  $item;
}
}

Library 现在是一个集合,但它没有提供检索或操纵单一数组成员的方法。

出处:phpchina
责任编辑:bluehearts

上一页 下一页 php设计模式介绍之迭代器模式 [2]

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
php设计模式介绍之观测模式
一个月的php学习总结
php设计模式介绍之策略模式
php设计模式介绍之伪对象模式
php设计模式介绍之注册模式
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
全兼容的纯CSS级联菜单要点浅析
CSS Sprites 图片整合技术
雅安,一场中式旅行
热烈祝贺"醒狮杯"圆满结束
菊花宝典大赏大奖教程《阳台》
交互设计师怎样和产品团队合作
Photoshop打造个性潮流音乐海报
简单解读面包屑
CSS盒模型
Apple与Microsoft网站可用性研究
栏目最新 栏目最新列表
safari 4 新特性
Photoshop制作精美高光流线字
IE下img多余5像素空白解决方法
XHTML1.0与HTML兼容指引16条
JavaScript优化细节
全兼容的纯CSS级联菜单要点浅析
CSS Sprites 图片整合技术
Photoshop打造个性潮流音乐海报
CSS盒模型
45度地图编辑器及游戏开发心得
>> 分页 首页 前页 后页 尾页 页次:1/81个记录/页 转到 页 共8个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

本文现有 1 条评论 暂时没有人参与评分


howlking Publish at 2008-7-27 13:56:07
您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
《Web标准设计》
《美工神话》
《Flash短片轻松学》
Illustrator CS3质感绘画表现技法
大师之路--Photoshop 完全解析
《用户体验要素》
HTML与CSS入门经典(第7版)
作品集 更多内容

华硕(Asus)手机 Zt23 LogoMark Asia Lenovo 某软件界 软件公司 02年临摹的小图 Flower Station UI Malata mobile show