什么是迭代器模式?

顺序访问集合对象的元素,不需要知道集合对象的底层实现或表示。

应用场景

顺序访问集合元素时,Java中集合框架自带了迭代器。

代码实现

示例: 顺序输出一个集合的所有元素

  1. //示例: 顺序输出集合的所有元素
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.ListIterator;
  5. /**
  6. * Java自带的迭代器模式 测试
  7. */
  8. public class JDKIteratorPattern {
  9. public static void main(String[] args) {
  10. //构造集合
  11. List<Integer> list = new ArrayList<>();
  12. //添加10个数字
  13. for (int i = 0; i < 10; i++) {
  14. list.add(i);
  15. }
  16. //迭代器输出集合元素
  17. ListIterator<Integer> iterator = list.listIterator();
  18. while (iterator.hasNext()) {
  19. Integer i = iterator.next();
  20. System.out.print(i);
  21. }
  22. //输出:
  23. //0123456789
  24. }
  25. }

JDK迭代器Iterator
image.png
ArrayList的迭代器具体实现
image.png

自定义一个迭代器

假设某集合存储了一些人名,迭代器输出每个人名

  1. //示例: 顺序输出集合的所有元素
  2. /**
  3. * 定义 迭代器
  4. */
  5. interface Iterator {
  6. //是否有下一个对象
  7. boolean hasNext();
  8. //获取下一个对象
  9. Object next();
  10. }
  11. /**
  12. * 定义 集合容器
  13. */
  14. interface Container {
  15. //获取迭代器
  16. Iterator getIterator();
  17. }
  18. class NameRepository implements Container {
  19. public String[] names = {"Robert", "John", "Julie", "Lora"};
  20. @Override
  21. public Iterator getIterator() {
  22. return new NameIterator();
  23. }
  24. private class NameIterator implements Iterator {
  25. int index;
  26. @Override
  27. public boolean hasNext() {
  28. return index < names.length;
  29. }
  30. @Override
  31. public Object next() {
  32. if (this.hasNext()) {
  33. return names[index++];
  34. }
  35. return null;
  36. }
  37. }
  38. }
  39. /**
  40. * 迭代器模式 测试
  41. */
  42. public class IteratorPattern {
  43. public static void main(String[] args) {
  44. NameRepository namesRepository = new NameRepository();
  45. for (Iterator iter = namesRepository.getIterator(); iter.hasNext(); ) {
  46. String name = (String) iter.next();
  47. System.out.println("Name : " + name);
  48. }
  49. //输出:
  50. //Name : Robert
  51. //Name : John
  52. //Name : Julie
  53. //Name : Lora
  54. }
  55. }