学习路径: https://coding.imooc.com/class/270.html
- 前言
迭代器模式一般不会自己维护代码,以用和读代码为主,以下自己实现集合类与迭代器类增强理解过程。 - 应用场景
public static void main(String[] args) {
// 待装载的数据
Course course = new Course("course");
Course course1 = new Course("course1");
Course course2 = new Course("course2");
// 创建容器
CourseSet courseSet = new CourseSetImpl();
// 容器装载数据
courseSet.addCourse(course);
courseSet.addCourse(course1);
courseSet.addCourse(course2);
// 操作集合
operateCourseSet(courseSet);
}
/**
* 操作集合,引入迭代器类
* @param courseSet
*/
public static void operateCourseSet(CourseSet courseSet){
// 获取集合的迭代器
CourseIterator iterator = courseSet.getIterator();
// 使用迭代器遍历集合
while (iterator.hasNext()){
iterator.next();
}
System.out.println("该集合的大小是:" + courseSet.size());
}
- 实现
/**
* 自定义集合的标准
*/
public interface CourseSet {
// 集合的大小
int size();
// 集合的操作
void addCourse(Course course);
void removeCourse(Course course);
// 提供一个迭代器用于遍历
CourseIterator getIterator();
}
/**
* 自定义迭代器的标准
*/
public interface CourseIterator {
boolean hasNext();
Course next();
}
/**
* 实现了自定义标准的集合
*/
public class CourseSetImpl implements CourseSet {
private ArrayList<Course> courseList;
public CourseSetImpl() {
courseList = new ArrayList<>();
}
@Override
public int size() {
return courseList.size();
}
@Override
public void addCourse(Course course) {
courseList.add(course);
}
@Override
public void removeCourse(Course course) {
courseList.remove(course);
}
/**
* 获取容器的迭代器
* @return
*/
@Override
public CourseIterator getIterator() {
return new CourseIteratorImpl(courseList);
}
}
/**
* 实现了自定义标准的迭代器
*/
public class CourseIteratorImpl implements CourseIterator {
private ArrayList<Course> arrayList;
// 持有容器元素的索引
int position;
// 持有容器元素的对象
private Course course;
public CourseIteratorImpl(ArrayList<Course> arrayList) {
this.arrayList = arrayList;
}
@Override
public boolean hasNext() {
if(this.position < arrayList.size()){
return true;
}
return false;
}
@Override
public Course next() {
this.course = arrayList.get(this.position);
System.out.println("第 "+ this.position + "个课程,课程名称为:"+ this.course.getName());
this.position++;
return this.course;
}
}
- 总结
自定义迭代器,就需要自定义一个集合类。所以使用迭代器模式的时候有可能加大类的维护成本。现有类库已经有迭代器的很好的实现,利用类库能降低维护系统的成本。