迭代器模式属于行为型模式。
这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
如果我们需要统一遍历不同的集合(容器),也可以利用迭代器模式解决(下面的案例就是解决这个问题)。
结构:
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。
传送门:https://mp.weixin.qq.com/s/jzddfh-7ynudmkjt0irl8q
如对本文有疑问, 点击进行留言回复!!
before社区电量是什么意思 Before社区电量获得方法
RecycleView入门详解(教你全面掌握RecycleView用法)
动态权限请求框架RxPermissions(几行代码搞定权限)
URL路径@PathVariable出现点号“.“时值遭截断问题
网友评论