迭代器模式

末鹿安然 提交于 2020-03-17 08:09:10

某厂面试归来,发现自己落伍了!>>>

    又称为游标模式, 它提供一种顺序集合、容器对象元素的方法, 而又无须暴露集合内部表示。
     特征: 抽离集合对象迭代行为到迭代器中, 提供一致访问接口
    属于行为型模式

适用场景:
    1、访问一个集合对象的内容而无须暴露它的内部表示
    2、为遍历不同的集合结构提供一个统一的访问接口

public interface Iterator<E> {

    /**
     * 获取下一个
     * @return
     */
    E next();

    /**
     * 是否存在下一个
     * @return
     */
    boolean hasNext();

}
public interface IAggregate<E> {
    /**
     * 添加
     * @param element
     * @return
     */
    boolean add(E element);

    /**
     * 移除
     * @param element
     * @return
     */
    boolean remove(E element);

    /**
     * 迭代器
     * @return
     */
    Iterator<E> iterator();
}
public class ConcreteIterator<E> implements Iterator<E> {

    private  List<E> list;

    private int cursor = 0;

    public ConcreteIterator(List<E> list) {
        this.list = list;
    }

    @Override
    public E next() {
        return this.list.get(this.cursor++);
    }

    @Override
    public boolean hasNext() {
        return this.cursor < this.list.size();
    }

}
public class ConcreteAggregate<E> implements IAggregate<E> {
    private List<E> list = new ArrayList<>();

    @Override
    public boolean add(E element) {
        return this.list.add(element);
    }

    @Override
    public boolean remove(E element) {
        return this.list.remove(element);
    }

    @Override
    public Iterator<E> iterator() {
        return new ConcreteIterator<>(this.list);
    }

}
public static void main(String[] args) {

    IAggregate<String> aggregate = new ConcreteAggregate<>();

    aggregate.add("110");
    aggregate.add("119");
    aggregate.add("120");

    Iterator<String> iterator = aggregate.iterator();

    while (iterator.hasNext()) {
        String element = iterator.next();
        System.out.println(element);
    }
}

===================================================================================

public class Course {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public interface iterator<E> {
    /**
     * 下一个元素
     * @return
     */
    E next();

    /**
     * 是否存在下一个
     * @return
     */
    boolean hasNext();

}
public interface ICourseAggregate {

    /**
     * 添加
     *
     * @param course
     */
    void add(Course course);

    /**
     * 删除
     *
     * @param course
     */
    void remove(Course course);

    /**
     * 迭代
     *
     * @return
     */
    Iterator<Course> iterator();
}
public class IteratorImpl<E> implements Iterator<E> {

    private List<E> list;

    private int cursor;

    private E element;

    public IteratorImpl(List<E> list) {
        this.list = list;
    }


    @Override
    public E next() {
        System.out.print("当前位置: " + cursor + " : ");
        element = list.get(cursor);
        cursor++;
        return element;
    }

    @Override
    public boolean hasNext() {

        if (cursor > list.size() - 1) {
            return false;
        }

        return true;
    }


}
public class IteratorImpl<E> implements Iterator<E> {

    private List<E> list;

    private int cursor;

    private E element;

    public IteratorImpl(List<E> list) {
        this.list = list;
    }


    @Override
    public E next() {
        System.out.print("当前位置: " + cursor + " : ");
        element = list.get(cursor);
        cursor++;
        return element;
    }

    @Override
    public boolean hasNext() {

        if (cursor > list.size() - 1) {
            return false;
        }

        return true;
    }


}
public class CourseAggregateImpl implements ICourseAggregate {

    private List courseList;

    public CourseAggregateImpl() {
        this.courseList = new ArrayList();
    }

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

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

    @Override
    public Iterator<Course> iterator() {
        return new IteratorImpl<>(courseList);

    }

}
public static void main(String[] args) {
    Course java = new Course("Java架构");

    Course javaBase = new Course("Java基础");
    Course design = new Course("设计模式");

    Course ai = new Course("人工智能");

    ICourseAggregate aggregate = new CourseAggregateImpl();
    aggregate.add(java);
    aggregate.add(javaBase);
    aggregate.add(design);
    aggregate.add(ai);

    System.out.println("=========================");

    printCourse(aggregate);
    aggregate.remove(javaBase);
    System.out.println("=========================");
    printCourse(aggregate);


}


private static void printCourse(ICourseAggregate aggregate) {
    Iterator<Course> iterator = aggregate.iterator();
    while (iterator.hasNext()) {
        Course course = iterator.next();
        System.out.println("<<" + course.getName() + ">>");
    }
}

优点:
    1、多态迭代: 为不同的聚合结构提供一致的遍历接口, 即一个迭代接口可以访问不同的聚集对象;
    2、简化集合对象接口: 迭代器模式将集合对象本身应该提供的元素迭代接口抽取到了迭代器中, 
    使集合对象无须关心具体迭代行为;
    3、元素迭代功能多样化: 每个集合对象都可以提供一个或多个不同的迭代器, 使的同种元素聚合结构可以有不同的迭代行为
    4 解耦迭代与集合: 迭代器模式 封装了具体的迭代算法, 迭代算法的变化, 不会影响到集合对象的架构
缺点: 
    1、对于比较简单的遍历(像数组或者有序列表), 使用迭代器方式遍历较为繁琐
    

源码: ArrayList、HashMap 的迭代器方法;mybatis中的 DefaultCursor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!