16.迭代器模式

一、介绍

  1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式
  2. 如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决
  3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构

二、原理类图

1

2.1 角色和职责

抽象迭代器(Iterator)角色:该角色负责定义访问和遍历元素的接口。
具体迭代器(Concrete Iterator)角色:该角色实现Iterator接口,完成容器元素的遍历。
抽象聚集(Aggregate)角色:该角色提供创建迭代器角色的接口。
具体聚集(Concrete Aggregate)角色:该角色实现抽象聚集接口,创建出容纳迭代器的对象。

2.2 代码分析

  1. 抽象迭代器Iterator的代码如下所示:
    【代码 5-15】 Iterator.java
public interface Iterator {
    public Object next();
    public boolean hasNext();
}
  1. 具体迭代器ConcreteIterator的代码如下所示。
    【代码 5-16】 ConcreteIterator.java
public class ConcreteIterator implements Iterator {
        private ConcreteAggregate agg;
        private int index = 0;
        private int size = 0;
        public ConcreteIterator(ConcreteAggregate agg) {
            this.agg = agg;
            size = agg.size();
            index = 0;
        }
        // 是否有下一个元素,即还没遍历结束
        public boolean hasNext() {
            return index < size;
        }
        //返回下一个元素
        public Object next() {
            if (index < size) {
                return agg.getElement(index++);
            } else {
                return null;
            }
        }
    }
  1. 抽象聚集Aggregate的代码如下所示。
    【代码 5-17】 Aggregate.java
 public interface Aggregate {
    public void add(Object obj);
    public Iterator creatIterator();
}
  1. 具体聚集ConcreteAggregate的代码如下所示。
    【代码 5-18】 ConcreteAggregate.java
public class ConcreteAggregate implements Aggregate {
	private Vector vector = new Vector();
	public void add(Object object) {
	    this.vector.add(object);
	}
	public Object getElement(int index) {
	    if (index < vector.size()) {
	        return vector.get(index);
	    } else {
	        return null;
	    }
	}
	public int size() {
	    return vector.size();
	}
	public Iterator creatIterator() {
	    return new ConcreteIterator(this);
	}
	}
  1. 应用类代码如下所示。
    【代码 5-19】 Client.java
public class Client {
  public static void main(String agrs[]) {
        // 定义聚集对象
        Aggregate agg = new ConcreteAggregate();
        agg.add("张三");
        agg.add("李四");
        agg.add("王五");
        // 遍历
        Iterator iterator = agg.creatIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
  1. 运行结果如下所示:
  张三
  李四
  王五

三、 优缺点

3.1 优点:

  • 迭代器模式简化了访问容器元素的操作,具备一个统一的遍历接口。
  • 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。

3.2 缺点:

  • 迭代器模式给使用者一个序列化的错觉,从而产生错误。
  • 迭代器的元素都是Object类型,没有类型特征(JDK1.5后通过引入泛型可以解决此问题)。
    注意:
    在java开发中,尽量不要自己写迭代器模式,用java API提供的Iterator一般就能满足项目需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值