迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部元素;
为遍历的对象提供一个如开始、下一个、是否结束、当前哪一项等统一的接口。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
实例UML图:
代码实现:
/**
* @author Shuyu.Wang
* @package:com.shuyu.iterator
* @description:迭代器接口类
* @date 2018-11-22 22:46
**/
public interface Iterator {
Object first();
Object next();
boolean isDone();
Object getCurrentItem();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.iterator
* @description:聚集接口类
* @date 2018-11-22 22:49
**/
public interface Aggregate {
Iterator getIterator();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.iterator
* @description:具体聚集类
* @date 2018-11-22 22:53
**/
public class ConcreteAggregate implements Aggregate {
private ArrayList<Object> arrayList=new ArrayList<>();
@Override
public Iterator getIterator() {
return new ConcreteIterator(this);
}
public int count(){
return arrayList.size();
}
public Object getArrayListValue(int id) {
return this.arrayList.get(id);
}
public void addArrayList(String value) {
this.arrayList.add(value);
}
}
@Override
public Object first() {
return concreteAggregate.getArrayListValue(0);
}
@Override
public Object next() {
Object object=null;
current++;
if (current<concreteAggregate.count()){
object=concreteAggregate.getArrayListValue(current);
}
return object;
}
@Override
public boolean isDone() {
return current>=concreteAggregate.count()?true:false;
}
@Override
public Object getCurrentItem() {
return concreteAggregate.getArrayListValue(current);
}
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class IteratorApplicationTests {
@Test
public void contextLoads() {
ConcreteAggregate concreteAggregate=new ConcreteAggregate();
concreteAggregate.addArrayList("name1");
concreteAggregate.addArrayList("name2");
concreteAggregate.addArrayList("name3");
concreteAggregate.addArrayList("name4");
Iterator iterator=new ConcreteIterator(concreteAggregate);
Object frist=iterator.first();
while (!iterator.isDone()){
log.info("到你了:"+iterator.getCurrentItem());
iterator.next();
}
}
}
执行结果:
2018-11-22 23:13:06.529 INFO 10556 --- [ main] com.shuyu.IteratorApplicationTests : 到你了:name1
2018-11-22 23:13:06.530 INFO 10556 --- [ main] com.shuyu.IteratorApplicationTests : 到你了:name2
2018-11-22 23:13:06.530 INFO 10556 --- [ main] com.shuyu.IteratorApplicationTests : 到你了:name3
2018-11-22 23:13:06.530 INFO 10556 --- [ main] com.shuyu.IteratorApplicationTests : 到你了:name4
github代码地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/iterator