設計模式之迭代器模式

定義

提供了一種方法,順序訪問一個集合對象中的各個元素,而又不暴露該對象的內部表示。

類型

行爲型

適用場景

①、訪問一個集合對象的內容而無需暴露它的內部表示。
②、爲遍歷不同的集合結構提供一個統一的接口。

優缺點

優點:
①、分離了集合對象的遍歷行爲。

缺點:
①、類的個數成對增加。

代碼實現

因爲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

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