迭代器模式
1、简介:迭代器模式提供一种方法访问一个聚合对象中的各个元素,而有保证不暴露其内部实现方式。
(1)它让我们能够游走在各种聚合类型数据的每一个元素之间,而有无需让大家知道游走的什么类型的聚合,反正都能够达到循环输出元素的目的。(2)它能够把游走的任务搬到迭代器上,而不再使用各种适合自己聚合类型的forEach来游走遍历元素。使得聚合和迭代器的任务各得其所。
这种模式能够解决,在一个系统中,存在不同存储数据的聚合类型的整合。想要简化代码,游走遍历每种聚合的每一个元素,就需要使用迭代器来简化。让对应的聚合类型集成迭代器Iterator,就能够使用hasNext()和next()方法。这样的简化使得聚合对象只负责存储数据,而由迭代器来遍历游走元素。
2.这里付一段简单的代码。
//定义一个迭代器接口
public interface Iterator{
boolean hasNext();
Object next();
}
//午餐迭代器实现迭代器接口
public class DinerMenuIterator implents Iterator(){
MenuItem[] items;
int position = 0;
public DinerMenuIterator (MenuItem items){
this.items = items;
}
public Object hasNext(){
MenuItem menuItem = items[position]
position = position + 1;
return menuItem;
}
public boolean hasNext(){
if(position > items.length || items.position == null){
return false;
}else{
return true;
}
}
}
//餐厅午餐菜单
public class DinnerMenu{
static final int MAX_ITEMS = 6;
int numberOfItems = 0;
MenuItem[] menuItems;
public Iterator createIterator(){
return new DinerMenuIterator(menuItems);
}
}
//这里省略以ArrayList存储形式的集合定义,名称定义为CoffeeIterator。同上的Iterator。
//女招待员对每个菜单的操作,无需知道其如何实现,直接使用Iterator对集合进行操作
public class Waitreess{
DinerMenu dinerMenu ;
CoffeeMenu coffeeMenu;
public waitress(DinerMenu dinerMenu,CoffeeMenu coffeeMenu){
this.dinerMenu= dinerMenu;
this.coffeeMenu= coffeeMenu;
}
public void printMenu(){
Iterator dinerMenuIterator = dinerMenu.createIterator();
Iterator coffeeIterator = coffeeMenu.createIterator();
printMenu(dinerMenuIterator);
printMenu(coffeeIterator);
}
public void printMenu(Iterator iterator){
while (iterator.hasNext()){
MenuItem menuItem = (MenuItem)iterator.next();
}
}
}
3、代码集成优化之后,发现这种方式和一种模式很像—-由子类来决定创建什么—–【工厂方法模式】。
这里叫做“迭代器和组合模式”。
后面有一部分关于迭代器的深入讲解,lue
4、“单一责任原则”:一个类应该只有一个引起变化的原因。