一、迭代器模式定义
1.迭代器模式又称为游标模式,它提供一种顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构,属于行为型模式。
2.迭代器的本质是抽离集合对象迭代行为到迭代器中,提供一致访问接口
3.迭代器模式应用场景:
A.访问一个集合对象的内容而无需暴露它的内部表示
B.为遍历不同的集合结构提供一个统一的访问接口
二、迭代器模式示例
1.迭代器模式主要包含三种角色:
A.抽象迭代器(Iterator):抽象迭代器负责定义访问和遍历元素的接口
B.具体迭代器(ConcreteIterator):提供具体的元素遍历行为
C.抽象容器(Aggregate):负责定义提供具体迭代器的接口
D.具体容器(ConcreteAggregate):创建具体迭代器
2.代码示例
1 public class Course { 2 private String name; 3 4 public Course(String name){ 5 this.name = name; 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 } 16 17 public interface Iterator<E> { 18 E next(); 19 boolean hasNext(); 20 } 21 22 public interface CourseAggregate { 23 void add(Course course); 24 void remove(Course course); 25 Iterator<Course> iterator(); 26 } 27 28 public class IteratorImpl<E> implements Iterator<E> { 29 30 private List<E> list; 31 private int cursor; 32 private E element; 33 public IteratorImpl(List list){ 34 this.list = list; 35 } 36 37 @Override 38 public E next() { 39 System.out.println("当前位置" + cursor + ":"); 40 element = list.get(cursor); 41 cursor++; 42 return element; 43 } 44 45 @Override 46 public boolean hasNext() { 47 if(cursor>list.size()-1){ 48 return false; 49 } 50 return true; 51 } 52 } 53 54 public class CourseAggregateImpl implements CourseAggregate { 55 56 private List courseList; 57 58 public CourseAggregateImpl(){ 59 this.courseList = new ArrayList(); 60 } 61 62 @Override 63 public void add(Course course) { 64 courseList.add(course); 65 } 66 67 @Override 68 public void remove(Course course) { 69 courseList.remove(course); 70 } 71 72 @Override 73 public Iterator<Course> iterator() { 74 return new IteratorImpl<Course>(courseList); 75 } 76 } 77 78 public class IteratorTest { 79 public static void main(String[] args) { 80 Course java = new Course("Java架构"); 81 Course javaBase = new Course("java入门"); 82 Course design = new Course("Java设计模式精讲"); 83 Course ai = new Course("人工智能"); 84 85 CourseAggregate courseAggregate = new CourseAggregateImpl(); 86 courseAggregate.add(java); 87 courseAggregate.add(javaBase); 88 courseAggregate.add(design); 89 courseAggregate.add(ai); 90 91 System.out.println("------课程列表------"); 92 printCourses(courseAggregate); 93 94 courseAggregate.remove(ai); 95 96 System.out.println("------删除操作之后的课程列表------"); 97 printCourses(courseAggregate); 98 99 } 100 101 public static void printCourses(CourseAggregate courseAggregate){ 102 Iterator<Course> iterator = courseAggregate.iterator(); 103 while (iterator.hasNext()){ 104 Course course = iterator.next(); 105 System.out.println("《" + course.getName() + "》"); 106 } 107 } 108 }
3.迭代器模式的优缺点
A.优点
a.多态迭代:为不同的聚合结构提供一致的遍历接口,即一个迭代接口可以访问不同的集合对象
b.简化集合对象接口:迭代器模式将集合对象本身应该提供的元素迭代接口抽取到了迭代器中,使集合对象无须关心具体迭代行为
c.元素迭代功能多样化:每个集合对象都可以提供一个或多个不同的迭代器,使的同种元素聚合结构可以有不同的迭代行为
d.解耦迭代与集合:迭代器模式封装了具体的迭代算法,迭代算法的变化,不会影响到集合对象的架构
B.缺点
a.对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐