经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
行为模式之迭代器模式
来源:cnblogs  作者:yewen1234  时间:2018/11/29 9:23:40  对本文有异议

迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。

定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。

类图如下所示。

 

 迭代器模式有以下4个角色。

  • 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
  • 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
  • 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
  • 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。

 Iterator.java

  1. public interface Iterator {
  2. public Object next();
  3. public boolean hasNext();
  4. }

ConcreteIterator.java

  1. public class ConcreteIterator implements Iterator {
  2. private ConcreteAggregate agg;
  3. private int index = 0;
  4. private int size = 0;
  5. public ConcreteIterator(ConcreteAggregate agg) {
  6. this.agg = agg;
  7. size = agg.size();
  8. index = 0;
  9. }
  10. @Override
  11. public Object next() {
  12. if (index < size) {
  13. return agg.getElement(index++);
  14. } else {
  15. return null;
  16. }
  17. }
  18. @Override
  19. public boolean hasNext() {
  20. return index < size;
  21. }
  22. }

Aggregate.java

  1. public interface Aggregate {
  2. public void add(Object obj);
  3. public Iterator createIterator();
  4. }

ConcreteAggregate.java

  1. public class ConcreteAggregate implements Aggregate {
  2. private Vector vector = new Vector();
  3. @Override
  4. public void add(Object obj) {
  5. this.vector.add(obj);
  6. }
  7. public Object getElement(int index) {
  8. if (index < this.vector.size()) {
  9. return vector.get(index);
  10. } else {
  11. return null;
  12. }
  13. }
  14. public int size() {
  15. return vector.size();
  16. }
  17. @Override
  18. public Iterator createIterator() {
  19. return new ConcreteIterator(this);
  20. }
  21. }

Client.java

  1. public class Client {
  2. public static void main(String[] args) {
  3. // 定义聚集对象
  4. Aggregate agg = new ConcreteAggregate();
  5. agg.add("张三");
  6. agg.add("李四");
  7. agg.add("王五");
  8. // 遍历
  9. Iterator iterator = agg.createIterator();
  10. while (iterator.hasNext()) {
  11. System.out.println(iterator.next());
  12. }
  13. }
  14. }

运行结果如下所示。

  1. 张三
  2. 李四
  3. 王五

优点:

  • 简化了访问容器元素的操作,具备一个统一的遍历接口。
  • 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。

缺点:

  • 给使用者一个序列化的错觉,从而产生错误。

应用场景:

  • 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,133-138.

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

本站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号