Iterator_迭代器模式_PHP语言描述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

感觉最近写的这些设计模式的例子,在定义描述方面差很多,以后都会先写一下用例设计模式的定义及简单讲解,在把例子附上,这样的感觉更好些,也让大家看得更清楚一些。

Iterator_迭代器模式的定义:

提供一种方法可以顺序的访问一个聚合对象中的集合,而不外露该对象的内部表示。

所谓的聚合是指一组对象的组合结构:比如数组,LIST,QUEUE等等(在PHP中得SPL库中,有完善的各类高级数据结构以及Iterator接口及其实现已方便PHP的foreach循环访问)。

Iterator_迭代器模式解决问题的思路:

仔细阅读上面的定义,我们可以知道我们需要一个统一的方法来访问各种实现不同的聚合对象。那么首先我们需要把这个统一的访问方法抽象并定义出来,按照这个统一的访问方式定义出来的接口在迭代器模式中对应的就是Iterator接口。

接下来就该考虑如何创建迭代器了,由于迭代器和相应的聚合对象紧密相关,因此应该让具体的聚合对象来负责创建相应的迭代器。

Iterator(interface):迭代器接口,用于抽象定义访问和遍历元素的接口。

ConcreteIterator(class implements Iterator interface):具体的迭代器实现类,实现对聚合对象的遍历,并跟踪遍历对象的各种索引及当前位置。

Aggregate(abstract class):聚合对象的抽象类,定义创建相应迭代器对象的接口。

ConcreteAggregate(class extends Aggregate):具体的聚合对象的实现类,实现创建相应的迭代器对象。

注:不同类型的聚合对象的实现类,需要实现不同的相应的迭代器类。

具体例子:

<?php/*** 迭代器接口,定义访问和遍历元素的操作 */interface IIterator{//移动到聚合对象的第一个元素位置public function first();//移动到聚合对象的下一个元素位置public function next();/*** 判断是否已经移动到聚合对戏那个的最后一个位置* @return  trun 表示移动到了聚合对象的最后一个位置* @return  false 表示还没有移动到聚合对象的最后一个位置*/public function isDone();/*** 取得迭代的当前元素* @return  返回迭代的当前元素*/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();}
?>


转载于:https://my.oschina.net/cniiliuqi/blog/64442

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组去重复

做一个新数组&#xff0c;重复的不加入 <script type"text/javascript">Array.prototype.delrepeat function() {var arr this;var _arr new Array();for (var i in arr) {if (i delrepeat) continue;if (_arr.length 0) _arr.push(arr[i]);for (var j 0…

Spring整合JDBC开发

背景 在JDBC开发中&#xff0c;充斥这大量重复的代码&#xff0c;可能只是换了个SQL语句&#xff0c;其他代码是完全不用变的。Spring的jar包里&#xff0c;提供了一个叫JDBCTemplate的模板&#xff0c;在保持操作灵活方便的情况下&#xff0c;将代码量降到最低。 配置文件 首…

【Android】EditText标签调用键盘

转自天翼空间开发资料。在xml文件中EditText标签有一个属性android:editable"false"和android:numeric"integer" android:numeric"integer"表示只允许输入数字&#xff0c;此属性可以限制用户只能输入数字内容。 android:editable表示是否可以输…

基于SpringMVC进行REST服务开发

背景 REST的概念这里不多过多阐述。在REST中&#xff0c;资源通过URL进行识别和定位。一般来说&#xff0c;以下这些HTTP方法通常会匹配为如下的CRUD动作&#xff1a; Create&#xff1a;POST Read&#xff1a;GET Update&#xff1a;PUT或PATCH Delete&#xff1a;DELETE…

HDU-1569 方格取数(2) 最小割最大流

题义很简单&#xff0c;还记得方格取数(1)的时候&#xff0c;使用状态压缩写的&#xff0c;这里由于行列数太大&#xff0c;因此无法进行压缩。所以要运用的最小割最大流的思想来解这道题。 大概是这样分析的&#xff0c;题义是要我们求在一个方格内取出N个点&#xff0c;使得这…

通俗易懂的讲SOA

<微服务设计>1.3节&#xff1a;SOA是一种设计方法&#xff0c;其中包含多个服务&#xff0c;而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用&#xff0c;而非采用进程内调用的方式。 通俗易懂的讲SOA …

PCI总线原理(二)

http://blog.c114.net/html/15/562315-75227.html PCI即Peripheral Component Interconnect&#xff0c;中文意思是“外围器件互联”&#xff0c;是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛&#xff0c;下面我详细介绍…

Windows环境中在同一个Tomcat下发布不同端口号的不同web程序

一、修改Tomcat路径下的conf文件下的 server.xml 文件。增加一个service 节点。 原service节点如下图所示&#xff1a; 新增service节点如下图所示&#xff0c;注意红色标注的是要修改的地方&#xff1a; 二、根据service.xml配置文件信息中对应的Engine节点的name属性&#…

java开发_Runtime

在java中经常需要获取一些系统信息&#xff0c;如系统的资源空间等。下面就是一些Runtime的应用&#xff1a; 1 public static void main(String[] a){2 Runtime runtime Runtime.getRuntime();3 long freeMemoery runtime.freeMemory();4 long tota…

Mybatis逆向工程自动生成代码文件

一般来说都会新建另外一个项目&#xff0c;用于生成代码文件&#xff0c;然后拷贝到需要的项目中。新建maven项目用于生成代码文件&#xff0c;项目目录如下所示&#xff1a; pom.xml内容如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" x…

LAMP平台架构浅析

LAMP是一个缩写&#xff0c;它指一组常用于来搭建动态网站或者服务器的开源软件&#xff0c;包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;PHP、Perl或者 Python编程语言(本文以php为例)。 下面就介绍一下如何基于rpm包的形式…

流程工业MES特点

流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主要通过对原料的混合、反应、分离、粉碎、加热等物理或化学的变化&#xff0c;是原料增值。 流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主…

掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。Android作为一种优秀的、承袭Linux的移动操作系统&#xff0c;其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。进程和线程的基本概念 当一个应用程序开始运行…

高温津贴:关键是消除劳动者“权利贫困”

每年6月至10月期间&#xff0c;劳动者从事露天岗位工作以及用人单位不能采取有效措施将作业场所温度降低到33℃以下的&#xff0c; 用人单位应当按月向劳动者发放高温津贴&#xff0c;违反者处 2000 元以上 10000 元以下罚款。 据报道&#xff0c;目前广州一些建筑工地、搬家公…

Log4j.properties的简单配置

一、首先导入jar包&#xff1a;log4j-1.2.17.jar 二、新增log4j.properties配置文件并输入以下内容&#xff1a; 三、在测试代码总中进行测试&#xff1a; Service public class CKKuCunServiceImpl implements CKKuCunService{Autowiredpublic CKKuCunMapper ckKuCunMapper;…

oracle中保留2位小数的写法

select to_char(1.5678,99.99) from dual 输出&#xff1a;1.57 select to_char(1.5,00.00) from dual 输出&#xff1a;01.50

C#中事务的简单使用

在C#中开启事务的步骤 一、调用SqlConnection对象的BeginTransaction()方法&#xff0c;创建一个SqlTransaction对象&#xff0c;标志事务开始。 二、将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 三、调用相应的方法执行SqlCommand命令。 四、调…

建立openstack quantum开发环境 .

建立openstack quantum开发环境 作者&#xff1a;张华 发表于&#xff1a;2012-4-6 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

使用Jquery插件bTabs实现多页签打开效果

官网地址&#xff1a;点击这里进入官网 资源导入 <link rel"stylesheet" href"b.tabs.css" type"text/css"> <!-- 插件核心脚本 --> <script type"text/javascript" src"b.tabs.js" ></script> &l…

体验Office 2013预览版

微软目前刚发布新版本的office2013,暂时没有中文版。Windows 8下搭配64位office 2013效果非常不错&#xff0c;具体浏览下方的视频。 X86&#xff08;32位&#xff09; 英文版&#xff1a;http://care.dlservice.microsoft.com/download/4/7/1/4712B4E1-4DD9-4468-B8A4-507D7F9…