Java-迭代器-设计模式(十五)

说明

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

UML
uml
角色:
1.Iterator(迭代器)
迭代器定义访问和遍历元素的接口
2.ConcreteIterator (具体迭代器)
具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
3.Aggregate (聚合)
聚合定义创建相应迭代器对象的接口
4.ConcreteAggregate (具体聚合)
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例

代码

自定义一个字符串集合的迭代器,代码如下。

迭代器角色,定义访问和遍历元素的接口

/**
 * @author ctl
 * @date 2021/1/26
 */
public interface Iterator {

    // 获取前一个
    public Object prev();

    // 获取后一个
    public Object next();

    // 是否还可以继续迭代
    public boolean hasNext();

    // 指针置为起始位置并返回对应值
    public Object first();
}

具体迭代器角色,实现迭代器接口,对该聚合遍历时跟踪当前位置

/**
 * @author ctl
 * @date 2021/1/26
 */
public class ConcreteIterator implements Iterator {

    private Collection collection;
    private int pos = -1;

    public ConcreteIterator(Collection collection) {
        this.collection = collection;
    }

    @Override
    public Object prev() {
        if (pos > 0) {
            pos--;
        }
        return collection.get(pos);
    }

    @Override
    public Object next() {
        if (pos < collection.size() - 1) {
            pos++;
        }
        return collection.get(pos);
    }

    @Override
    public boolean hasNext() {
        return pos < collection.size() - 1;
    }

    @Override
    public Object first() {
        pos = 0;
        return collection.get(pos);
    }
}

聚合角色,定义创建相应迭代器对象的接口

/**
 * @author ctl
 * @date 2021/1/26
 */
public interface Collection {

    public Iterator iterator();

    public Object get(int i);

    public int size();
}

具体聚合角色,实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例

/**
 * @author ctl
 * @date 2021/1/26
 */
public class ConcreteCollection implements Collection {

    private String[] strs;

    public ConcreteCollection(String[] strs) {
        this.strs = strs;
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }

    @Override
    public Object get(int i) {
        return strs[i];
    }

    @Override
    public int size() {
        return strs.length;
    }
}

测试类

/**
 * @author ctl
 * @date 2021/1/26
 */
public class IteratorMain {
    public static void main(String[] args) {
        String[] strs = {"a", "b", "c", "d", "e"};
        Collection collection = new ConcreteCollection(strs);
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
    }
}

结果
结果
完成了对字符串的迭代。

总结

其实我们对迭代器并不陌生,jdk中的很多集合类都实现了迭代器模式,我们可以根据迭代器模式的思想实现个性化的迭代器,从而达到使用不同的方式来对集合进行遍历。
比如本例中实现了一个first方法,可以在任意过程中将指针指向首位然后再继续迭代,当然也可以实现将指针指向随意一个有效位置进行迭代,或者实现反向迭代等等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值