努力保头发的打工人
努力保头发的打工人
发布于 2020-12-30 / 46 阅读 / 0 评论 / 0 点赞

迭代器模式

1 概述

定义 提供一种方法访问一个容器中的各个元素,而又不需要暴露该对象的内部细节。

迭代器是为容器服务的,迭代器模式现在已经融入到每种语言之中了,java中集合都以实现,基本在使用开发项目中不用我们自定义容器和迭代器了。但还是要了解的。

迭代器模式类图.png

  • Iterator 迭代器接口或抽象类,负责定义访问元素和遍历元素的接口。

  • ConcreteIterator 具体迭代器

  • aggregate 容器接口

  • concreteAggregate 具体容器

2 代码示例

创建容器接口和实现类

/**
 * @author chiangtaol
 * @date 2020-12-07
 * @describe 抽象容器
 */
public interface Aggregate<T extends Object> {
​
    /**
     * 元素增加
     */
    void add(T object);
​
    /**
     * 移除元素
     */
    void remove(T object);
​
    /**
     * 迭代器
     */
    Iterator<T> iterator();
}
​
/**
 * @author chiangtaol
 * @date 2020-12-07
 * @describe 容器实现类
 */
public class AggregateImpl<E> implements Aggregate<E>{
​
    private Vector<E> vector = new Vector();
​
    /**
     * 元素增加
     *
     * @param object
     */
    @Override
    public void add(E object) {
        this.vector.add(object);
    }
​
    /**
     * 移除元素
     *
     * @param object
     */
    @Override
    public void remove(E object) {
        this.vector.remove(object);
    }
​
    /**
     * 迭代器
     */
    @Override
    public Iterator<E> iterator() {
        return new IteratorImpl(this.vector);
    }
}

创建迭代器接口和实现类

/**
 * @author chiangtaol
 * @date 2020-12-07
 * @describe 迭代器接口
 */
public interface Iterator<E extends Object> {
​
    E next();
​
    boolean hasNext();
​
    boolean remove();
}
​
/**
 * @author chiangtaol
 * @date 2020-12-07
 * @describe 迭代器实现类
 */
public class IteratorImpl<E> implements Iterator<E>{
​
    private Vector<E> vector;
​
    public int cursor = 0;
​
    public IteratorImpl(Vector<E> vector){
        this.vector = vector;
    }
​
    @Override
    public E next() {
        E result;
        if (hasNext()){
            result = this.vector.get(this.cursor++);
        }else {
            result = null;
        }
        return result;
    }
​
    @Override
    public boolean hasNext() {
        if (this.cursor == vector.size()){
            return false;
        }else{
            return true;
        }
    }
​
    @Override
    public boolean remove() {
        this.vector.remove(this.cursor);
        return true;
    }
}

测试代码

@Test
void iterator() {
    Aggregate<String> aggregate = new AggregateImpl<>();
    aggregate.add("1");
    aggregate.add("3");
    aggregate.add("5");
    Iterator<String> iterator = aggregate.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

运行结果如下:

1 3 5