经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式 | 迭代器模式(iterator)
来源:cnblogs  作者:莫愆  时间:2019/6/5 8:52:26  对本文有异议

定义:

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

结构:(书中图,侵删)

一个抽象的聚合类
若干个具体的聚合类,有一个生成迭代器的方法(相当于实现java的Iterable接口)
一个抽象的迭代器,定义了迭代所必须的方法
若干个具体的迭代器
 
来学习一下java中结构
《Java编程思想》中,有关集合的类图(应该是java5的,整体结构应该变化不大):

感觉太复杂了,看起来头疼,自己看源码画了一个和迭代器有关的类图(以ArrayList为例,java8):

实例:

就来仿照一个arraylist吧,Iterator接口就不用写了,java已经有了。
为了简化代码量,List接口还是自己写一个。
抽象List接口:
  1. package designpattern.iterator;
  2. import java.util.Iterator;
  3. public interface MyList<E> extends Iterable<E> {// 为了客户端直接通过接口使用foreach方法
  4. void set(E e, int index);
  5. E get(int index);
  6. void remove(int index);// 数组实现,有点麻烦,就不写了
  7.  
  8. void changeIterator(Iterator iterator);
  9. int getSize();
  10. }
ArrayList实现(并不能扩展长度):
  1. package designpattern.iterator;
  2. import java.util.Iterator;
  3. public class MyArrayList<E> implements MyList<E>, Iterable<E> {
  4. E[] data;
  5. private int size;
  6. Iterator<E> iterator;
  7. public MyArrayList(E[] data) {
  8. super();
  9. this.data = data;
  10. size = data.length;
  11. iterator = new MyInteratorAsc<>(this);// 默认使用正序迭代器
  12. }
  13. @Override
  14. public void set(E e, int index) {
  15. if (index < size) {
  16. data[index] = e;
  17. } else {
  18. System.out.println(index + "大于数组大小");
  19. }
  20. }
  21. @Override
  22. public E get(int index) {
  23. return data[index];
  24. }
  25. @Override
  26. public Iterator<E> iterator() {
  27. return iterator;
  28. }
  29. @Override
  30. public void remove(int index) {
  31. throw new UnsupportedOperationException("暂未实现");
  32. }
  33. @Override
  34. public int getSize() {
  35. return size;
  36. }
  37. @Override
  38. public void changeIterator(Iterator iterator) {
  39. this.iterator = iterator;
  40. }
  41. }
正序迭代器:
  1. package designpattern.iterator;
  2. import java.util.Iterator;
  3. public class MyInteratorAsc<E> implements Iterator<E> {
  4. MyList<E> myList;
  5. public MyInteratorAsc(MyList<E> myList) {
  6. super();
  7. this.myList = myList;
  8. this.current = 0;
  9. }
  10. int current;
  11. @Override
  12. public boolean hasNext() {
  13. if (current < myList.getSize()) {
  14. return true;
  15. } else {
  16. return false;
  17. }
  18. }
  19. @Override
  20. public E next() {
  21. return myList.get(current++);
  22. }
  23. }
倒序迭代器:
  1. package designpattern.iterator;
  2. import java.util.Iterator;
  3. public class MyInteratorDesc<E> implements Iterator<E> {
  4. MyList<E> myList;
  5. public MyInteratorDesc(MyList<E> myList) {
  6. super();
  7. this.myList = myList;
  8. this.current = myList.getSize() - 1;
  9. }
  10. int current;
  11. @Override
  12. public boolean hasNext() {
  13. if (current >= 0) {
  14. return true;
  15. } else {
  16. return false;
  17. }
  18. }
  19. @Override
  20. public E next() {
  21. return myList.get(current--);
  22. }
  23. }
客户端:
  1. package designpattern.iterator;
  2. public class Client {
  3. public static void main(String[] args) {
  4. MyList<String> myList = new MyArrayList<>(new String[4]);
  5. myList.set("", 0);
  6. myList.set("", 1);
  7. myList.set("", 2);
  8. myList.set("", 3);
  9. myList.set("", 4);
  10. for (String string : myList) {
  11. System.out.println(string);
  12. }
  13. System.out.println("-------换成倒序-------");
  14. myList.changeIterator(new MyInteratorDesc<>(myList));
  15. for (String string : myList) {
  16. System.out.println(string);
  17. }
  18. }
  19. }
结果输出:
  1. 4大于数组大小
  2. -------换成倒序-------

总结:

自己去实现会发现很多的问题,迭代器几乎天天都在用,实在不知道该总结些什么。
就用书中的原话吧:
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

原文链接:http://www.cnblogs.com/imoqian/p/10975796.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号