PHP设计模式入门之迭代器模式原理与实现方法分析

本文实例讲述了PHP设计模式入门之迭代器模式。分享给大家供大家参考,具体如下:

在深入研究这个设计模式之前,我们先来看一道面试题,来自鸟哥的博客,

题目是这样的:

使对象可以像数组一样进行foreach循环,要求属性必须是私有。

不使用迭代器模式很难实现,先看实现的代码:

sample.php

  1. <?php
  2. class Sample implements Iterator{
  3. private $_arr;
  4. public function __construct(Array $arr){
  5. $this->_arr = $arr;
  6. }
  7. public function current(){
  8. return current($this->_arr);
  9. }
  10. public function next(){
  11. return next($this->_arr);
  12. }
  13. public function key(){
  14. return key($this->_arr);
  15. }
  16. public function valid(){
  17. return $this->current() !== false;
  18. }
  19. public function rewind(){
  20. reset($this->_arr);
  21. }
  22. }

index.php

  1. <?php
  2. require 'Sample.php';
  3. $arr = new Sample(['max', 'ben', 'will']);
  4. foreach ($arr as $k=>$v){
  5. echo $k."-".$v."<br />";
  6. }

其中Iterator接口来自php的spl类库,在写完设计模式的相关文章之后,将会进一步研究这个类库。

另外在网上找到了一段yii框架中关于迭代器模式的实现代码:

  1. class CMapIterator implements Iterator {
  2. /**
  3. * @var array the data to be iterated through
  4. */
  5. private $_d;
  6. /**
  7. * @var array list of keys in the map
  8. */
  9. private $_keys;
  10. /**
  11. * @var mixed current key
  12. */
  13. private $_key;
  14. /**
  15. * Constructor.
  16. * @param array the data to be iterated through
  17. */
  18. public function __construct(&$data) {
  19. $this->_d=&$data;
  20. $this->_keys=array_keys($data);
  21. }
  22. /**
  23. * Rewinds internal array pointer.
  24. * This method is required by the interface Iterator.
  25. */
  26. public function rewind() {
  27. $this->_key=reset($this->_keys);
  28. }
  29. /**
  30. * Returns the key of the current array element.
  31. * This method is required by the interface Iterator.
  32. * @return mixed the key of the current array element
  33. */
  34. public function key() {
  35. return $this->_key;
  36. }
  37. /**
  38. * Returns the current array element.
  39. * This method is required by the interface Iterator.
  40. * @return mixed the current array element
  41. */
  42. public function current() {
  43. return $this->_d[$this->_key];
  44. }
  45. /**
  46. * Moves the internal pointer to the next array element.
  47. * This method is required by the interface Iterator.
  48. */
  49. public function next() {
  50. $this->_key=next($this->_keys);
  51. }
  52. /**
  53. * Returns whether there is an element at current position.
  54. * This method is required by the interface Iterator.
  55. * @return boolean
  56. */
  57. public function valid() {
  58. return $this->_key!==false;
  59. }
  60. }
  61. $data = array('s1' => 11, 's2' => 22, 's3' => 33);
  62. $it = new CMapIterator($data);
  63. foreach ($it as $row) {
  64. echo $row, '<br />';
  65. }

关于迭代器设计模式官方的定义是:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构,又叫做游标(Cursor)模式。

好吧,我不是很能理解。为什么明明数组已经可以用foreach来遍历了还要用这样一种迭代器模式来实现,只有等待工作经验的加深来进一步理解吧。