java迭代器模式

来源:互联网 发布:免费的网络推广方式 编辑:程序博客网 时间:2024/06/10 01:01

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

类型:行为类模式

类图:

                                                    

自己写的一个例子:

迭代器接口:

public interface Iterator {//首个元素Object First();    //是否迭代完毕boolean hasnext();//显示先一个元素对象Object next();//返回当前元素对象Object Current();}
聚集对象接口

public interface Agreegate {//创建迭代对象Iterator  CreateIterator();//添加对象void add(Object o);//移除对象void remove(Object o);//获取指定为的对象 Object get(int x);  //获取聚集对象的对象的长度 int getLength(); }

具体聚集对象:

public class ConcreateAgreegate implements Agreegate {List<Object> l = new ArrayList<Object>();public ConcreateAgreegate() {}@Overridepublic Iterator CreateIterator() {return new ConcreatIterator(this);}@Overridepublic void add(Object o) {l.add(o);}@Overridepublic void remove(Object o) {l.remove(o);}public Object get(int x) {return l.get(x);}@Overridepublic int getLength() {return l.size();}}
具体迭代器对象:

public class ConcreatIterator implements Iterator {Agreegate agree;int current = 0;public ConcreatIterator(Agreegate agree) {this.agree = agree;}@Overridepublic Object First() {return agree.get(0);}@Overridepublic boolean hasnext() {return current <agree.getLength() ? true : false;}@Overridepublic Object next() {Object o = agree.get(current);current++;return o;}@Overridepublic Object Current() {return agree.get(current);}}

客户端:

public static void main(String[] args) {Agreegate a = new ConcreateAgreegate();a.add("动动");a.add("动动挑挑");a.add("动动挑");a.add("动动跳跳");a.add("我去动动");a.add("硝酸钠动动");Iterator i = a.CreateIterator();while (i.hasnext()) {System.out.println(i.next());}}

结果:

动动
动动挑挑
动动挑
动动跳跳
我去动动
硝酸钠动动


迭代器模式的优缺点

        迭代器模式的优点有:

  • 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
  • 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
  • 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

        迭代器模式的缺点:

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

 

迭代器模式的适用场景

       迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。

       但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。


0 0