• Iterator pattern 及其在java API中的运用


    1.问题:

      当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇。我们不禁要问java是如何实现这一目标的。这就是我今天要谈的话题。

    根据Iterator pattern模式我把java中的集合类分为四类:即:

    Iterator(抽象迭代器对应于java中的Iterator,其实java这个Iterator还有抽象聚合的功能,因为它实现了Iterable这个接口,而Iterable这个接口就是个抽象聚合类。), concreteIterator(对应与Collection,Map两个大类,及其这两个大类所对应的子类。)

    Aggregate(抽象聚合,对应于java中的Iterable这个接口,其实质它是一个工厂类,生产Iterator的工厂)

    ConcreterAggregate(具体聚合,实现Aggregate的类。这个类里面有聚集的对象,如何得到聚集元素,以及聚集对象的个数)

    2.简要介绍一下:Iterator Patten

    通过上面对java集合类的分类,我们可以很容易知道Iterator pattern 模式的角色有:Iterator    、concreteIterator、  Aggregate、   ConcreteAggregate、Client(相当于一个测试类。)

    Iterator类的代码如下:

    package com.qls.IteratorPattern2;

    public interface Iterator {
    void first();//第一个元素
    void next();//下一个元素
    boolean isDone();//是否到最后一个元素
    Object currentItem();//返回当前元素
    }

    ConcreteIterator类的代码如下:

    package com.qls.IteratorPattern2;

    public class ConcreteIterator implements Iterator {
    private int index;
    private int size;
    private ConcreteAggregate concreteAggregate;
    public ConcreteIterator(ConcreteAggregate concreteAggregate) {
    this.concreteAggregate=concreteAggregate;
    size=concreteAggregate.size();
    index=0;
    }

    @Override
    public void first() {
    // TODO Auto-generated method stub
    index=0;
    }

    @Override
    public void next() {
    // TODO Auto-generated method stub
    if(index<size){
    index++;
    }
    }

    @Override
    public boolean isDone() {
    // TODO Auto-generated method stub
    return index>=size;
    }

    @Override
    public Object currentItem() {
    // TODO Auto-generated method stub
    return concreteAggregate.getElement(index);
    }

    }

    Aggregate的代码如下:

    package com.qls.IteratorPattern2;

    public interface Aggregate {
    Iterator createIterator();
    }

    ConcreteAggregate的代码如下:

    package com.qls.IteratorPattern2;

    public class ConcreteAggregate implements Aggregate {
    //聚集对象
    private Object[] obj={"1","2","3","4","5","6"};

    @Override
    public Iterator createIterator() {
    // TODO Auto-generated method stub
    return new ConcreteIterator(this);//this代表:ConcreteAggregate
    }
    /**
    * 返回聚集的大小。
    * @return
    */
    public int size(){
    return obj.length;
    }
    /**
    * 得到聚集元素
    * @param index 聚集元素所对应的下标。
    */
    public Object getElement(int index){
    if(index<obj.length){
    return obj[index];
    }else{
    return null;
    }
    }
    }

    Client的代码如下:

    package com.qls.IteratorPattern2;

    /**
    * 把聚集元素打印出来。
    * @author 秦林森
    *
    */
    public class Client {
    private ConcreteAggregate concreteAggregate=new ConcreteAggregate();
    private Iterator it;
    public void operation(){
    it = concreteAggregate.createIterator();
    while(!it.isDone()){
    System.out.println(it.currentItem());
    it.next();
    }
    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Client().operation();
    }

    }

    3.总结:

    通过对Iterator pattern 的简单认识,可以消除我们对迭代器的神秘感,它的实现只不过是:在Aggregate类中有一个createIterator()方法,用以产生Iterator。把聚聚对象的

    元素交给这个Iterator。上述例子中的聚集对象时一个Object[]的数组。

  • 相关阅读:
    个人:我的2011生活看板
    个人管理:公司做的稻盛阿米巴培训笔记
    使用TOGAF来做业务架构 价值驱动产品开发
    30天敏捷结果(21)正面失败,吸取教训,改善结果
    2010年12月blog汇总:敏捷个人
    30天敏捷结果(25):固定时间,灵活范围
    101与金根回顾敏捷个人:(11)执行力
    团队管理:设计团队的一周
    云:构建云计算的核心技术与平台
    读书笔记:千万别学英语
  • 原文地址:https://www.cnblogs.com/1540340840qls/p/6140635.html
Copyright © 2020-2023  润新知