php实现设计模式之 迭代器模式
<?php
/*迭代器模式: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。(行为模式)
*
1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口。
4.具体集合角色(Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。
*/ /**
* 迭代器接口,定义访问和遍历元素的操作
*/
interface IIterator{
//移动到聚合对象的第一个元素位置
public function first();
//移动到聚合对象的下一个元素位置
public function next(); /**
* 判断是否已经移动到聚合对象的最后一个位置
* true 表示移动到了聚合对象的最后一个位置
* false 表示还没有移动到聚合对象的最后一个位置
*/
public function isDone(); /**
* 取得迭代的当前元素
* 返回迭代的当前元素
*/
public function currentItem();
} /**
* 具体的迭代器实现对象,示意的是聚合对象为数组的迭代器
* 不同的聚合对象相应的迭代器的实现是不同的
*/ class ConcreteIterator implements IIterator{
//持有被迭代的具体聚合对象
private $aggregate;
/**
* 内部索引,记录当前迭代到的索引位置
* -1表示刚刚开始的时候,迭代器指向聚合对象第一个对象之前
*/
private $index = -1;
private $aggregateCount = null;
/**
* 构造函数,传入被迭代的具体聚合对象
* @param $aggregate 被迭代的具体聚合对象
*/
public function __construct($aggregate){
$this->aggregate = $aggregate;
$this->aggregateCount = $this->aggregate->getCounts();
} public function first(){
$this->index = 0;
} public function next(){
if($this->index < $this->aggregateCount){
$this->index = $this->index + 1;
}
} public function isDone(){
if($this->index == $this->aggregateCount){
return true;
}
return false;
} public function currentItem(){
return $this->aggregate->getItem($this->index);
} public function getAggregateCount(){
return $this->aggregateCount;
}
} /**
* 聚合对象的抽象类,定义了创建相应迭代器对象的接口,每一个实现该聚合对象抽象类的对象都要实现这个抽象方法
*/
abstract class Aggregate{
public abstract function createIterator();
} /**
* 具体的聚合对象,实现创建相应迭代器对象的功能
*/
class ConcreteAggregate extends Aggregate{
//聚合对象的具体内容
private $arrayAgg = null; /**
* 构造函数:传入聚合对象具体的内容,在这个例子中是数组
* @param $arrayAgg 聚合对象的具体内容
*/ public function __construct($arrayAgg){
$this->arrayAgg = $arrayAgg;
} public function createIterator(){
//实现创建Iterator的工厂方法
return new ConcreteIterator($this);
} public function getItem($index){
if($index < sizeof($this->arrayAgg)){
return $this->arrayAgg[$index];
}
} public function getCounts(){
return sizeof($this->arrayAgg);
}
} /**
* 看看具体的使用方法
*/
$aggregate = new ConcreteAggregate(array('张三','李四','王五'));
$iterator = $aggregate->createIterator(); $iterator->first(); while(!$iterator->isDone()){
$obj = $iterator->currentItem();
echo "The obj == ".$obj."<br>";
$iterator->next();
}
?>
UML

php实现设计模式之 迭代器模式的更多相关文章
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- Python进阶:设计模式之迭代器模式
在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
- 实践GoF的设计模式:迭代器模式
摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...
- 【GOF23设计模式】迭代器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- php设计模式之迭代器模式
今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
随机推荐
- C语言 · 回文数
问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. 方案一: int main(){ int ...
- Html5 布局方式
在Html5之前,统一采用的是Div+css的方式进行布局,但是却和开发人员的命名方式,喜好有关.在新的Html5中,布局却显得更加人性化,更易理解了.如增加了Header,Footer,Sectio ...
- iOS-App发布证书的申请与使用
i开发环境:xcode5.1.1 iphonesdk:7.1 开发机器:iMac 真机部署测试:apple个人开发者ID 向导: 必备IDP证书和distribution证书(第一个证书是真机部署测试 ...
- BCP 数据的导入和导出
BCP 命令的参数很多,使用 -h 查看帮助信息,注意:参数是区分大小写的 使用BCP命令导出和导入数据常用的参数如下 bcp {[[database_name.][schema_name]].{ta ...
- (App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
(App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKi ...
- SQL Server 存储过程生成insert语句
你肯定有过这样的烦恼,同样的表,不同的数据库,加入你不能执行select insert 那么你肯定需要一条这样的存储过程,之需要传入表明,就会给你生成数据的插入语句. 当然数据表数量太大,你将最好用 ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- Android探索之ContentProvider熟悉而又陌生的组件
前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...
- 重置EntityFramework数据迁移到洁净状态
前言 翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题.[注意]:文章非一字一句的翻译,就重要的问题进行解释并解决. 话题引入 无法确定这种场景是 ...
- 1Z0-053 争议题目解析688
1Z0-053 争议题目解析688 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 688.Which two statements are true about the compr ...