设计模式专题(十六)——迭代器模式
设计模式专题(十六)——迭代器模式
(原创内容,转载请注明来源,谢谢)
一、概述
迭代器模式(Iterator)提供一种方法,顺序访问一个聚合对象中的每个元素,而又不暴露该对象的内部表示。当需要访问一个聚集对象,不管这些对象是什么都要遍历,则就要用到迭代器模式。另外,对聚集有多种方式遍历时,也可以用迭代器模式。
迭代器为遍历不同的聚集结构提供了开始入口、访问下一个、判断是否结束、当前某一项内容等的统一接口。foreach就是一个迭代器的体现,其不管传入的数组内部构造,都会逐个遍历数组的元素。
二、类图
三、PHP中的迭代器
PHP中,通常情况下,foreach只能对数组遍历,当需要对类进行遍历,PHP提供了接口,实现接口的类就可以直接用foreach进行遍历。关于此部分内容,有一篇很经典的博客——http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html,里面除了迭代器,还讲了PHP的SPL里面的各中类和接口。
1、Iterator接口
该接口定义了五个方法,包括current、next、key、valid、rewind,需要在current里面实现获取返回当前内容;next里实现循环到下一个元素;key实现获取键的方式;valid实现验证当前键是否有效;rewind实现。
2、IteratorAggregate接口
虽然Iterator接口可以实现对对象属性的遍历,但是很复杂,需要实现五个方法,较为繁琐。因此,PHP还定义了一个迭代器,IteratorAggregate。
继承该接口的类,只需要实现一个方法,getIterator,就可以实现迭代的功能。该方法需要返回另一个PHP内部定义的类Traversable的实例。
在PHP官方文档中已经很清晰的说明如何使用:
<?php
class myData implementsIteratorAggregate {
public $property1 = "Public propertyone";
public $property2 = "Public propertytwo";
public $property3 = "Public propertythree";
public function __construct() {
$this->property4 = "lastproperty";
}
public function getIterator() {
return new ArrayIterator($this);
}
}
$obj = new myData;
foreach($obj as $key=> $value) {
var_dump($key, $value);
echo "n";
}
?>
这个方法的输出了属性、属性值,如下:
string(9) "property1"
string(19) "Public propertyone"
string(9) "property2"
string(19) "Public propertytwo"
string(9) "property3"
string(21) "Public propertythree"
string(9) "property4"
string(13) "lastproperty"
——written by linhxx 2017.08.14
相关阅读:
设计模式专题(十五) ——组合模式
设计模式专题(十四)——适配器模式
设计模式专题(十三) ——备忘录模式
设计模式专题(十二)——状态模式
设计模式专题(十一)——抽象工厂模式
设计模式专题(十)——观察者模式
设计模式专题(九) ——外观模式
设计模式专题(八) ——模板方法模式
设计模式专题(七)——建造者模式
设计模式专题(六)——原型模式
设计模式专题(五)——工厂方法模式
设计模式专题(四)——代理模式
设计模式专题(三)——装饰模式
设计模式专题(二)——策略模式
设计模式专题(一)——面向对象的设计原则
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络
- 博客园自定义皮肤扁平化设计
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week3 目标检测
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍
- Udacity并行计算课程笔记-The GPU Hardware and Parallel Communication Patterns
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week1 机器学习策略
- coursera 视频总是缓冲或者无法观看的解决办法
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--week3 超参数调试、Batch正则化和程序框架
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
- Andrew Ng机器学习课程笔记--week3(逻辑回归&正则化参数)
- Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
- C++学习笔记之模板篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实战技巧 | 知其代码方可审计
- 进程、线程、协程篇
- 基于pandas数据预处理基础操作
- Python中字典的详细用法
- Android抓包总结-HTTPS单向认证&双向认证突破
- 2020 ISG“观安杯”最高分值web题的解题思路大放送
- 详解 JS 压缩图片
- LeetCode 1553. Minimum Number of Days to Eat N Oranges
- 异步IO数据库队列缓存
- markdown转为pdf文件
- [已解决]报错:Required request body is missing
- jupyter notebook修改默认路径和浏览器
- python selenium while 循环
- implicitly_wait()隐式等待
- [已解决]python FileNotFoundError: [WinError 3] for getsize(filepath)