设计模式专题(十六)——迭代器模式

设计模式专题(十六)——迭代器模式

(原创内容,转载请注明来源,谢谢)

一、概述

迭代器模式(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

相关阅读:

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不会写文章的程序员不是好厨师

Spring源码初探-IOC(2)-Bean的初始化-自定义标签解析

前面一文介绍的是Spring对于DefaultElement的解析,例如bean/import/alias等,但是在Spring体系中也存在很多扩展标签,例如事...

543
来自专栏Kirito的技术分享

深入理解RPC之序列化篇--Kryo

一年前,笔者刚刚接触RPC框架,从单体式应用向分布式应用的变革无疑是让人兴奋的,同时也对RPC背后到底做了哪些工作产生了兴趣,但其底层的设计对新手而言并不是很...

42710
来自专栏zhisheng

渣渣菜鸡的蚂蚁金服面试经历(二)

17、如果存取相同的数据,ArrayList 和 LinkedList 谁占用空间更大?

543
来自专栏java一日一条

Java 8 开发顶级技巧

我使用Java 8编码已经有些年头,既用于新的应用程序,也用来迁移现有的应用,感觉是时候写一些我发现的非常有用的“最佳实践”。我个人并不喜欢“最佳实践”这个说法...

231
来自专栏向治洪

Hibernate之初体验

在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?       如果...

1817
来自专栏企鹅号快讯

我们编写 React 组件的最佳实践

刚接触 的时候,在一个又一个的教程上面看到很多种编写组件的方法,尽管那时候 框架已经相当成熟,但是并没有一个固定的规则去规范我们去写代码。 在过去的一年里,...

1597
来自专栏深度学习计算机视觉

迪米特法则

一个对象应该对其他对象有最少的了解 迪米特法则对低耦合提出了明确的要求 1、只和朋友交流 虽然一个类和多个类产生依赖关系,但它只和朋友类交流 朋友类的定义...

3378
来自专栏Android先生

Java面向对象OOP

(1)、单一职责原则(Single Responsibility Principle)

602
来自专栏程序员的SOD蜜

还在写SQL的同志,去喝杯咖啡吧!

--标题可能比较“雷人”,但这是我今天早上的第一个感受。我们有一个同事昨天加班写了一大堆有关某些大表(字段很多的表)的增、删、查的SQL语句,看着哪些SQL语句...

2165
来自专栏tkokof 的技术,小趣及杂念

一个游戏程序员的代码书写观(一)

游戏中基本都有MessageBox的需求,虽然可以使用OS层面的MessageBox,但是一般而言都不能满足游戏的需求,有鉴于此,我们实现了第一版的定制Mess...

662

扫描关注云+社区