经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
PHP设计模式—迭代器模式
来源:cnblogs  作者:幽篁晓筑  时间:2020/12/8 9:08:28  对本文有异议

 

定义:

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

 

结构:

  • Iterator:迭代器接口,用于定义得到开始对象、得到下一个对象、判断是否到有效、当前对象等抽象方法,统一接口,目前PHP已经集成有该类。
  • IteratorAggregate:容器接口,目前PHP已经集成有该类。
  • ConcreteAggregate:具体容器类,继承IteratorAggregate。
  • ConcreteIterator:具体迭代器类,继承Iterator。
  • Client:客户端代码。

 

代码实例:

  1. /**
  2. * IteratorAggregate 源码
  3. * Interface to create an external Iterator.
  4. * @link https://php.net/manual/en/class.iteratoraggregate.php
  5. */
  6. interface IteratorAggregate extends Traversable {
  7. /**
  8. * Retrieve an external iterator
  9. * @link https://php.net/manual/en/iteratoraggregate.getiterator.php
  10. * @return Traversable An instance of an object implementing <b>Iterator</b> or
  11. * <b>Traversable</b>
  12. * @since 5.0.0
  13. */
  14. public function getIterator();
  15. }
  16. /**
  17. * Iterator源码
  18. * Interface for external iterators or objects that can be iterated
  19. * themselves internally.
  20. * @link https://php.net/manual/en/class.iterator.php
  21. */
  22. interface Iterator extends Traversable {
  23. /**
  24. * Return the current element
  25. * @link https://php.net/manual/en/iterator.current.php
  26. * @return mixed Can return any type.
  27. * @since 5.0.0
  28. */
  29. public function current();
  30. /**
  31. * Move forward to next element
  32. * @link https://php.net/manual/en/iterator.next.php
  33. * @return void Any returned value is ignored.
  34. * @since 5.0.0
  35. */
  36. public function next();
  37. /**
  38. * Return the key of the current element
  39. * @link https://php.net/manual/en/iterator.key.php
  40. * @return mixed scalar on success, or null on failure.
  41. * @since 5.0.0
  42. */
  43. public function key();
  44. /**
  45. * Checks if current position is valid
  46. * @link https://php.net/manual/en/iterator.valid.php
  47. * @return boolean The return value will be casted to boolean and then evaluated.
  48. * Returns true on success or false on failure.
  49. * @since 5.0.0
  50. */
  51. public function valid();
  52. /**
  53. * Rewind the Iterator to the first element
  54. * @link https://php.net/manual/en/iterator.rewind.php
  55. * @return void Any returned value is ignored.
  56. * @since 5.0.0
  57. */
  58. public function rewind();
  59. }
  60. /**
  61. * 具体聚集类
  62. * Class ConcreteAggregate
  63. */
  64. class ConcreteAggregate implements \IteratorAggregate
  65. {
  66. private $data = [];
  67. /**
  68. * 往迭代器里面添加数据
  69. */
  70. public function add($name)
  71. {
  72. $this->data[] = $name;
  73. }
  74. /**
  75. * 获取迭代器
  76. * @return ConcreteIterator|\Traversable
  77. */
  78. public function getIterator()
  79. {
  80. // TODO: Implement getIterator() method.
  81. return new ConcreteIterator($this->data);
  82. }
  83. }
  84. /**
  85. * 具体迭代器类
  86. * Class ConcreteIterator
  87. */
  88. class ConcreteIterator implements \Iterator
  89. {
  90. private $key = 0;
  91. private $data = [];
  92. public function __construct($data)
  93. {
  94. $this->data = $data;
  95. $this->key = 0;
  96. }
  97. /**
  98. * 返回当前元素
  99. */
  100. public function current()
  101. {
  102. // TODO: Implement current() method.
  103. return $this->data[$this->key];
  104. }
  105. /**
  106. * 前进到下一个元素
  107. */
  108. public function next()
  109. {
  110. // TODO: Implement next() method.
  111. return $this->key++;
  112. }
  113. /**
  114. * 返回当前元素的键
  115. */
  116. public function key()
  117. {
  118. // TODO: Implement key() method.
  119. return $this->key;
  120. }
  121. /**
  122. * 检查当前位置是否有效
  123. */
  124. public function valid()
  125. {
  126. // TODO: Implement valid() method.
  127. return isset($this->data[$this->key]);
  128. }
  129. /**
  130. * 将Iterator倒退到第一个元素
  131. */
  132. public function rewind()
  133. {
  134. // TODO: Implement rewind() method.
  135. return $this->key = 0;
  136. }
  137. }
  138. // 客户端调用
  139. $concreteAggregate = new ConcreteAggregate();
  140. $concreteAggregate->add('张三');
  141. $concreteAggregate->add('李四');
  142. $concreteAggregate->add('王五');
  143. $concreteIterator = $concreteAggregate->getIterator();
  144. foreach ($concreteIterator as $concrete) {
  145. echo $concrete . "<br>";
  146. }
  147. // 结果
  148. 张三
  149. 李四
  150. 王五

 

原文链接:http://www.cnblogs.com/woods1815/p/14031533.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号