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 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
随机推荐
- 先有 Mac 还是先有银元?
自从开设了这个公众号以后,收到最多的问题是:听了 Mac 君的介绍,我也觉得 Mac 很好,可是穷屌丝一枚,真买不起,怎么破?前几天我在微博上说,读了我的书,就有 Mac 了.居然有读者来问:这是真的 ...
- TODO:Ubuntu下安装Node
TODO:Ubuntu下安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...
- AngularJs之二
今天先讲一个angularJs的表单绑定实例: <div ng-app="myApp" ng-controller="formCtrl"> < ...
- SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- Unity 文件读取
存储: 在程序发布后文件的存放有两种,第一种是打包到Uniyt的资源包中(*.unity3D),第二种就是把文件存放在一个特殊的目录如:StreamingAssets,这个目录的东西Unity不会打包 ...
- Windows Phone 8弹窗
新建一个UserControl,添加到相应位置 <Grid x:Name="LayoutRoot" Background="{StaticResource Phon ...
- vue小总结
以下是我在使用vue过程中自己对vue的一些小总结,希望对学习vue的亲们能有所帮助: 1. http的post请求: this.$http({url: '/someUrl', method: ' ...
- 前端学PHP之文件操作
× 目录 [1]文件类型 [2]文件属性 [3]目录路径[4]目录遍历[5]目录统计[6]目录增删[7]目录复制[8]文件操作[9]文件内容 前面的话 在程序运行时,程序本身和数据一般都存在内存中,当 ...
- .NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化
所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblo ...
- Web APi之Web Host消息处理管道(六)
前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和响应抽象成HttpRespon ...