设计模式之迭代器模式

定义

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

类型

行为型

适用场景

①、访问一个集合对象的内容而无需暴露它的内部表示。
②、为遍历不同的集合结构提供一个统一的接口。

优缺点

优点:
①、分离了集合对象的遍历行为。

缺点:
①、类的个数成对增加。

代码实现

因为Java中已经有自己的迭代器了,所以,就简单实现一下自己的迭代器。
首先创建一个课程类

public class Course {

    private String name;
    public Course(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

创建一个迭代器

public interface CourseIterator {

    /**
     * 获取去下一个课程
     */
    Course nextCourse();

    /**
     * 判断是不是最后一个课程
     */
    boolean isLastCourse();
}

提供两个方法,一个是获取下一个课程,还有一个是判断是不是最后一个课程。
创建实现类

public class CourseIteratorImpl implements CourseIterator {

    private List<Course> courseList;
    private int position;
    private Course course;

    public CourseIteratorImpl(List<Course> courseList) {
        this.courseList = courseList;
    }

    @Override
    public Course nextCourse() {
        System.out.println("返回课程,位置是:" + position);
        Course course = courseList.get(position);
        position++;
        return course;
    }

    @Override
    public boolean isLastCourse() {
        if (position < courseList.size()) {
            return false;
        }
        return true;
    }
}

接着需要创建一个操作课程的类

public interface CourseAggregate {

    void addCourse(Course course);
    void removeCourse(Course course);

    /**
     * 获取课程迭代器
     */
    CourseIterator getCourseIterator();
}

它能增加、移除和获取课程迭代器的方法。

public class CourseAggregateImpl implements CourseAggregate {

    private List<Course> courseList;
    public CourseAggregateImpl(){
        courseList = new ArrayList<>();
    }

    @Override
    public void addCourse(Course course) {
        courseList.add(course);
    }

    @Override
    public void removeCourse(Course course) {
        courseList.remove(course);
    }

    @Override
    public CourseIterator getCourseIterator() {
        return new CourseIteratorImpl(courseList);
    }
}

getCourseIterator()方法获取之前创建好的迭代器的实现类。
编写测试类

public class MainTest {

    public static void main(String[] args) {
        Course course1 = new Course("Java设计模式");
        Course course2 = new Course("Python从入门到精通");
        Course course3 = new Course("Vue脚手架搭建");
        Course course4 = new Course("Html5入门");

        CourseAggregate courseAggregate = new CourseAggregateImpl();
        courseAggregate.addCourse(course1);
        courseAggregate.addCourse(course2);
        courseAggregate.addCourse(course3);
        courseAggregate.addCourse(course4);

        System.out.println("----课程列表----");
        printCourses(courseAggregate);

        courseAggregate.removeCourse(course3);
        courseAggregate.removeCourse(course2);
        System.out.println("----移除课程之后的课程列表");
        printCourses(courseAggregate);
    }

    /**
     * 打印课程
     */
    private static void printCourses(CourseAggregate courseAggregate) {
        CourseIterator courseIterator = courseAggregate.getCourseIterator();
        while (!courseIterator.isLastCourse()) {
            Course course = courseIterator.nextCourse();
            System.out.println(course.getName());
        }
    }
}

输出结果:

简单的迭代器就编写完了,代码非常简单,这里就不做过多的讲解了。

相关源码

1. Jdk中的Iterator
2. Mybatis中的Cursor

参考链接
https://coding.imooc.com/learn/list/270.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章