当前位置: 移动技术网 > IT编程>开发语言>Java > 结合案例深入解析迭代器模式

结合案例深入解析迭代器模式

2019年06月19日  | 移动技术网IT编程  | 我要评论

一、基本概念

迭代器模式属于行为型模式。

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

如果我们需要统一遍历不同的集合(容器),也可以利用迭代器模式解决(下面的案例就是解决这个问题)。

二、结构

结构:

 

 

  • container 是聚合类,其中 getiterator() 方法可以产生一个 iterator
  • iterator 主要定义了 hasnext() 和 next() 方法;
  • 每一个container的实现类都会有一个具体的iterator实现类来帮助实现迭代;

三、案例

实现两个容器能够统一遍历。(或者两个以上)

先看代码结构: (这里我将两个迭代器实现类写在两个容器内部)

 

 

代码:

public interface container {
    iterator getiterator();
}
public interface iterator<e> {
    boolean hasnext();
    e next();
}

 

两个容器类,他们内部的容器不同,内部有自带不同的迭代器:

public class concretecontainer1 implements container {

    public integer[] arr;

    public concretecontainer1() {
        arr = new integer[10];
        for(int i = 0; i < 10; i++) arr[i] = i;
    }

    @override
    public iterator getiterator() {
        return new concreteiterator1<integer>();
    }

    private class concreteiterator1<e> implements iterator{

        int index;

        @override
        public boolean hasnext() {
            if(index < arr.length)
                return true;
            return false;
        }

        @override
        public object next() {
            if(hasnext())
                return arr[index++];
            return null;
        }
    }
}
public class concretecontainer2 implements container {

    public arraylist arr;

    public concretecontainer2() {
        arr = new arraylist();
        for(int i = 0; i < 10; i++) arr.add(i);
    }

    @override
    public iterator getiterator() {
        return new concreteiterator1<integer>();
    }

    private class concreteiterator1<e> implements iterator{

        int index;

        @override
        public boolean hasnext() {
            if(index < arr.size())
                return true;
            return false;
        }

        @override
        public object next() {
            if(hasnext())
                return arr.get(index++);
            return null;
        }
    }
}

 

测试:

// 如果不这么做,需要区分c1和c2的遍历方式, 一个是数组,一个是list
public class mytest {

    public static void main(string[] args){
        container c1 = new concretecontainer1();
        container c2 = new concretecontainer2();

        arraylist<iterator>its = new arraylist<>();
        its.add(c1.getiterator()); // 将c1迭代器加入its
        its.add(c2.getiterator()); // 将c1迭代器加入its

        // 实现了统一遍历, 只需要将迭代器加入到 its中即可
        for(iterator it : its) {
            while(it.hasnext())
                system.out.print( it.next() + " ");
            system.out.println();
        }
    }
}

 

输出:

0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9

 

四、总结

优点:

  • 在同一个聚合上可以有多个遍历;
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码;
免费java高级资料需要自己领取,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo高并发分布式等教程,一共30g。
传送门:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网