现在假设,有一个教室类,里面包含了一堆学生,我现在要遍历教室里的学生,怎么来玩儿

1.常规

  1. package com.example.demo.pattern.iterator;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * @author chenchao
  6. * @date 2021/11/8
  7. */
  8. public class WithoutIteratorPattern {
  9. public static void main(String[] args) {
  10. Student student1 =new Student("张三");
  11. Student student2 =new Student("李四");
  12. Map<String, Student> students = new HashMap<String, Student>();
  13. students.put(student1.getName(), student1);
  14. students.put(student2.getName(), student2);
  15. Classroom classroom = new Classroom();
  16. classroom.setStudents(students);
  17. Map<String, Student> resultStudents = classroom.getStudents();
  18. for(Student resultStudent : resultStudents.values()) {
  19. System.out.println(resultStudent);
  20. }
  21. }
  22. /**
  23. * 教室类
  24. * @author chenchao
  25. *
  26. */
  27. public static class Classroom {
  28. private Map<String, Student> students;
  29. public Map<String, Student> getStudents() {
  30. return students;
  31. }
  32. public void setStudents(Map<String, Student> students) {
  33. this.students = students;
  34. }
  35. }
  36. /**
  37. * 学生类
  38. * @author chenchao
  39. *
  40. */
  41. public static class Student {
  42. private String name;
  43. public String getName() {
  44. return name;
  45. }
  46. public void setName(String name) {
  47. this.name = name;
  48. }
  49. public Student(String name) {
  50. this.name = name;
  51. }
  52. @Override
  53. public String toString() {
  54. return "Student{" +
  55. "name='" + name + '\'' +
  56. '}';
  57. }
  58. }
  59. }

2.迭代器模式

  1. package com.example.demo.pattern.iterator;
  2. import java.util.*;
  3. /**
  4. * @author chenchao
  5. * @date 2021/11/8
  6. */
  7. public class IteratorPattern {
  8. public static void main(String[] args) {
  9. Student student1 = new Student("小明");
  10. Student student2 = new Student("小王");
  11. Classroom classroom = new Classroom(2);
  12. classroom.addStudent(student1);
  13. classroom.addStudent(student2);
  14. ClassroomIterator iterator = classroom.iterator();
  15. while(iterator.hasNext()) {
  16. Student student = iterator.next();
  17. System.out.println(student);
  18. }
  19. }
  20. /**
  21. * 代表了一个集合类
  22. */
  23. public interface Aggregate {
  24. Iterator<Student> iterator();
  25. }
  26. /**
  27. * 学生类
  28. */
  29. public static class Student {
  30. private String name;
  31. public Student(String name) {
  32. this.name = name;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. @Override
  38. public String toString() {
  39. return "Student [name=" + name + "]";
  40. }
  41. }
  42. /**
  43. * 教室迭代器
  44. * @author chenchao
  45. *
  46. */
  47. public static class ClassroomIterator implements Iterator {
  48. private Classroom classroom;
  49. private int index;
  50. public ClassroomIterator(Classroom classroom) {
  51. this.classroom = classroom;
  52. this.index = 0;
  53. }
  54. @Override
  55. public boolean hasNext() {
  56. if(index < classroom.getLength()) {
  57. return true;
  58. } else {
  59. return false;
  60. }
  61. }
  62. @Override
  63. public Student next() {
  64. Student student = classroom.getStudent(index);
  65. index++;
  66. return student;
  67. }
  68. }
  69. /**
  70. * 教室类
  71. * @author chenchao
  72. *
  73. */
  74. public static class Classroom implements Aggregate {
  75. private List<Student> students;
  76. /**
  77. * last相当于是数组的长度
  78. */
  79. private int last = 0;
  80. public Classroom(int size) {
  81. this.students = new ArrayList<Student>(2);
  82. }
  83. public Student getStudent(int index) {
  84. return students.get(index);
  85. }
  86. public void addStudent(Student student) {
  87. this.students.add(student);
  88. last++;
  89. }
  90. public int getLength() {
  91. return last;
  92. }
  93. /**
  94. * 返回一个教室迭代器,其中封装了教室自己,让迭代器可以获取教室中的数据
  95. */
  96. @Override
  97. public ClassroomIterator iterator() {
  98. //return students.iterator();
  99. return new ClassroomIterator(this);
  100. }
  101. }
  102. }

3.好处

面向Iterator接口编程,无论底层的数据结构和迭代算法如何变化,调用者都不用修改代码

高内聚,低耦合,漂亮