迭代模式(Iterator Pattern) – 设计模式之行为模式

迭代模式(Iterator Pattern) – 设计模式之行为模式:

 目录

迭代模式(Iterator Pattern)

类图

例子-遍历:

过程:

类图:

代码:

抽象迭代器 Iterator

具体迭代器 ConcreteIterator

抽象容器  Aggregate

具体容器 ConcreteAggregate

测试:

结果:

总结:

使用场景


迭代模式(Iterator Pattern)

定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

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

  当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。

 迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责。

 

类图

迭代模式通用类图:

 

 

例子-遍历:

过程:

  实现类似List增加、删除和遍历数据

 

类图:

 

代码:

抽象迭代器 Iterator

抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,hasNext()是否已经访问到底部

public interface Iterator<T> {
  T first();
  boolean hasNext();
  T next();
}

 

具体迭代器 ConcreteIterator

具体迭代器角色要实现迭代器接口,完成容器元素的遍历。

public class ConcreteIterator implements Iterator {
    private Vector vector;
    //定义当前游标
    private int cursor = 0;
    @SuppressWarnings("unchecked")
    public ConcreteIterator(Vector _vector){
        this.vector = _vector;
    }
    //返回第一个元素
    @Override
    public Object first() {
        if(this.vector.size()>0){
            return this.vector.get(NumberUtils.INTEGER_ZERO);
        }
        return null;
    }
    //判断是否到达尾部
    @Override
    public boolean hasNext() {
        if(this.cursor == this.vector.size()){
            return false;
        }
        return true;
    }

注意 开发时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素。

抽象容器  Aggregate

容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法。

public interface Aggregate<T> {
  void add(T object); // 增加元素
  void remove(T object); // 删除元素
  Iterator getIterator(); // 遍历所有的元素
}

 

具体容器 ConcreteAggregate

具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。

public class ConcreteAggregate implements Aggregate {
    //容纳对象的容器
    private Vector vector = new Vector();
    @Override
    public void add(Object object) {
        this.vector.add(object);
    }
    @Override
    public void remove(Object object) {
        this.vector.remove(object);
    }
    @Override
    public Iterator getIterator() {
        return new ConcreteIterator(this.vector);
    }
}

 

测试:

public class ItetatorTest {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        String dream = "dream";
        aggregate.add("yan");
        aggregate.add(1222);
        aggregate.add(86.5);
        aggregate.add(dream);
        Iterator iterator = aggregate.getIterator();
        System.out.println("first: "+iterator.first());
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println("============ remove ============");
        aggregate.remove(dream);
        iterator = aggregate.getIterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

 

结果:

first: yan

yan

1222

86.5

dream

============ remove ============

yan

1222

86.5

    简单来说,迭代器就类似于一个数据库中的游标,可以在一个容器内上下翻滚,遍历所有它需要查看的元素。

 

总结:

优点:

   1、它支持以不同的方式遍历一个聚合对象。

   2、迭代器简化了聚合类。

   3、在同一个聚合上可以有多个遍历。

   4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

 

使用场景

   1、访问一个聚合对象的内容而无须暴露它的内部表示。

   2、需要为聚合对象提供多种遍历方式。

   3、为遍历不同的聚合结构提供一个统一的接口。

 

 在Java开发中,尽量不要自己写迭代器模式!使用Java提供的Iterator一般就能满足你的要求了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值