设计模式之迭代器模式
在需要迭代的对象类中实现迭代器接口,接着在一个迭代对象管理类中把这些需要迭代的对象一个个遍历出来即可。首先设计一个获取迭代对象的接口,然后将需要迭代的对象类实现该接口,再设计一个管理迭代对象的类,最后是一个客户端主类。
获取迭代对象的接口:
package com.freshbin.pattern.iterator.myexample.iterator;
import java.util.Iterator;
/**
* 管理需要遍历的对象接口
*
* @author freshbin
* @date 2019-1-8 11:44:17
*/
public interface ContainerInterface {
Iterator<String> getIterator();
}
需要迭代的对象类:
package com.freshbin.pattern.iterator.myexample.iterator;
import java.util.Iterator;
import com.sun.xml.internal.ws.dump.LoggingDumpTube.Position;
/**
* GloryOfKingGame
*
* @author freshbin
* @date 2019-1-8 11:46:07
*/
public class GloryOfKingGame implements ContainerInterface {
private final static Integer MAX_ARRAY_SIZE = 10;
private Integer index = 0;
private String[] heros = new String[MAX_ARRAY_SIZE];
public GloryOfKingGame() {
addItems("亚瑟");
addItems("后羿");
addItems("鲁班");
addItems("安琪拉");
addItems("程咬金");
addItems("项羽");
}
private void addItems(String name) {
heros[index] = name;
index++;
}
@Override
public Iterator<String> getIterator() {
return new GloryOfKingIterator();
}
class GloryOfKingIterator implements Iterator {
private Integer position = 0;
@Override
public boolean hasNext() {
if(position < index) {
return true;
}
return false;
}
@Override
public Object next() {
String name = heros[position];
position++;
return name;
}
}
}
package com.freshbin.pattern.iterator.myexample.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* LOLGame
* @author freshbin
* @date 2019-1-8 11:46:07
*/
public class LOLGame implements ContainerInterface {
private List<String> heros;
public LOLGame() {
heros = new ArrayList<>();
heros.add("盖伦");
heros.add("寒冰");
heros.add("马尔扎哈");
heros.add("蛮王");
heros.add("剑圣");
heros.add("赵信");
}
@Override
public Iterator<String> getIterator() {
//return new LOLIterator();
return heros.iterator();
}
/*class LOLIterator implements Iterator {
private Integer position = 0;
@Override
public boolean hasNext() {
if(position < heros.size()) {
return true;
}
return false;
}
@Override
public Object next() {
String name = heros.get(position);
position++;
return name;
}
}*/
}
这里使用内部类实现迭代器接口,因为list已经实现了Iterator接口,所以就可以不用内部类实现迭代器接口了。
管理迭代对象的类:
package com.freshbin.pattern.iterator.myexample;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 遍历迭代器
*
* @author freshbin
* @date 2019-1-8 12:04:42
*/
public class ManagerIterator {
private List<Iterator> iterators;
private Integer parallelFlag = 0;
private Integer chuanxingFlag = 0;
public ManagerIterator() {
iterators = new ArrayList<>();
}
public void addIterator(Iterator iterator) {
iterators.add(iterator);
}
public void parallelDisplayIterator() {
System.out.println("并行方式");
iterators.stream().parallel().forEach(iterator -> {
System.out.println("==========开始================" + parallelFlag);
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("===========结束===============" + parallelFlag);
parallelFlag++;
});
}
public void chuanxingDisplayIterator() {
System.out.println("串行方式");
iterators.stream().forEach(iterator -> {
System.out.println("==========开始===============" + chuanxingFlag);
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("==========开始===============" + chuanxingFlag);
chuanxingFlag++;
});
}
}
这里使用了jdk8的并行遍历集合,第一次用这个形式遍历集合,看起来遍历方法内部像是会存在多线程问题
客户端主类:
package com.freshbin.pattern.iterator.myexample;
import com.freshbin.pattern.iterator.myexample.iterator.ContainerInterface;
import com.freshbin.pattern.iterator.myexample.iterator.GloryOfKingGame;
import com.freshbin.pattern.iterator.myexample.iterator.LOLGame;
/**
* 迭代器模式
*
* @author freshbin
* @date 2019-1-8 11:40:42
*/
public class IteratorPatternMain {
public static void main(String[] args) {
ContainerInterface lolIterator = new LOLGame();
ContainerInterface gloryOfKingIterator = new GloryOfKingGame();
ManagerIterator managerIterator = new ManagerIterator();
managerIterator.addIterator(lolIterator.getIterator());
managerIterator.addIterator(gloryOfKingIterator.getIterator());
managerIterator.parallelDisplayIterator();
// managerIterator.chuanxingDisplayIterator();
}
}
最后是效果图:
多运行几次可以看到,参数的赋值出现了问题,说明集合的元素不是一个个取出来遍历的。