迭代器模式

解决问题的“第三者”-迭代器模式

模式定义

提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示

使用场景

遍历一个容器对象时

简单实现

具体迭代器类(实现迭代器接口-Iterator)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package IteratorMode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list=new ArrayList<T>();
    private int cursor=0;
    public ConcreteIterator(List<T> list) {
        this.list = list;
    }
    public boolean hasNext() {
        return cursor!=list.size();
    }
    public T next() {
        T obj=null;
        if(this.hasNext()){
            obj=this.list.get(cursor++);
        }
        return obj;
    }
    public void remove() {
    }
}

容器接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package IteratorMode;

import java.util.Iterator;

public interface Aggregate<T> {
    //添加一个元素
    void add(T obj);
    //移除一个元素
    void remove(T obj);
    //获取迭代器对象
    Iterator<T> iterator();
}

具体容器类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package IteratorMode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcreteAggregate<T> implements Aggregate<T> {
    public List<T> list=new ArrayList<T>();
    public void add(T obj) {
        list.add(obj);
    }

    public void remove(T obj) {
        list.remove(obj);
    }

    public Iterator<T> iterator() {
        return new ConcreteIterator<T>(list);
    }
}

客户类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package IteratorMode;

import java.util.Iterator;

public class Client {
    public static void main(String[] args) {
        Aggregate<String> a=new ConcreteAggregate<String>();
        a.add("Aige");
        a.add("Studio/n");
        a.add("SM");
        a.add(" Brother");
        Iterator iterator=a.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

执行结果

ccc.png

总结

优点

​ 支持以不同方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系

缺点

​ 对类文件的增加

了解即可,应用比较少,基本都有相应的内置实现