设计模式学习三、迭代器模式
一、什么是迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
二、使用场景
通用的方法遍历集合元素
三、模式构成

迭代器角色:定义遍历元素所需要的方法
具体迭代器角色:实现迭代器接口的方法
聚集类:Aggregate(抽象类)和ConcreteAggregate(具体聚集类)表示聚集类,是用来存储迭代器的数据。
在Aggregate(抽象类)中有一个CreateIterator方法,用来获取迭代器
四、举个例子
例子:jone与tony分别管理一家餐厅,两家餐厅宣布共同经营。jone负责早餐,tony负责午餐。两家只有一个服务员。 但是两家的菜单有所区别,jone的菜单用数组管理,tony用的是数组。这个服务员如何打印菜单更加方便。
分析:如果使用传统的方式,服务员打印菜单的时候,会先用一个for循环打印jone数组的菜单,然后用另一个循环打印tony链表的菜单,而且这两者输出内容的代码基本相同(造成代码冗余)。这时候,就可以使用迭代器,用一种通用的方式,既可以打印jone的菜单,又可以打印tony的菜单 。
代码:
//抽象迭代器
interface Iterator {
public boolean hasNext();
public Object next();
}
//具体迭代器
class ArrayIterator implements Iterator{
private Object []items;
private int index=0;
private int max;
public ArrayIterator(Object[] items,int max) {
this.items = items;
this.max=max;
}
@Override
public boolean hasNext() {
if (items.length!=0&&index<items.length&&index<max){
return true;
}else{
return false;
}
}
@Override
public Object next() {
return items[index++];
}
}
class ArrayListIterator implements Iterator{
private List list=new ArrayList();
private int pos=0;
public ArrayListIterator(List list) {
this.list = list;
}
@Override
public boolean hasNext() {
if (list.size()>0&&pos<list.size()){
return true;
}
return false;
}
@Override
public Object next() {
return list.get(pos++);
}
}
interface Menu{//抽象聚集类
public void add(Object obj);
public Iterator createIterator();//通过此方法获取迭代器
}
//具体聚集类
class JoneBreakfastMenu implements Menu{
//具体的存储器,直接使用java的list
private List list=new ArrayList();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public Iterator createIterator() {
return new ArrayListIterator(list);
}
}
//具体聚集类
class TonyDinnerMenu implements Menu{
private String[] items=new String[10];
private int pos;
@Override
public void add(Object obj) {
if (pos<10)
items[pos++]= (String) obj;
else{
System.err.println("菜单不能再多了");
}
}
@Override
public Iterator createIterator() {
return new ArrayIterator(items,pos);
}
}
class Waiter{
private TonyDinnerMenu dinnerMenu=new TonyDinnerMenu();
private JoneBreakfastMenu breakfastMenu=new JoneBreakfastMenu();
public void addBreakfast(String value){
breakfastMenu.add(value);
}
public void addDinner(String value){
dinnerMenu.add(value);
}
//通过一个iterator(就可以遍历数组与List)
private void print(Iterator iterator){
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
public void print(){
System.out.println("早餐");
print(breakfastMenu.createIterator());
System.out.println("晚餐");
print(dinnerMenu.createIterator());
}
}
public class Iterator1 {
public static void main(String args[]){
Waiter waiter=new Waiter();
waiter.addBreakfast("鸡蛋");
waiter.addBreakfast("牛奶");
waiter.addBreakfast("面包");
waiter.addDinner("苦瓜炒鸡蛋~~");
waiter.print();
}
}
五、补充
java中,对于迭代器有自己的实现,像是list,set,map,collection都有实现好的迭代器。如果想要自己的集合使用迭代器,可以实现java中的Iterator接口。所以,我们不需要手工写一个Iterator接口
ps:渣渣菜鸟一个,如有不对,请指正~~~

浙公网安备 33010602011771号