07.迭代器模式
概念
迭代器模式提供一种方法访问一个容器中的各个元素,而又不需要暴露该对象的内部细节。
用途:
从迭代器模式的概念可以看出,迭代器模式的重要用途就是帮助我们遍历容器。
实现方式
迭代器模式包含如下角色:
Iterator 抽象迭代器
ConcreteIterator:具体迭代器
Aggregate:抽象容器
Concrete Aggregate;具体容器
这里我们举一个例子,我们有一个菜单,我们想要展示出菜单中所有菜品的名字和报价信息等。
(1)定义抽象迭代器
/**
* 抽象迭代器
*/
public interface Iterator<E> {
/**
* 返回该迭代器中是否还有未遍历过的元素
* @return
*/
boolean hasNext();
/**
* 返回迭代器中的下一个元素
* @return
*/
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
(2)定义具体的迭代器
/**
* 菜单迭代器 —— 具体迭代器类
*/
public class MenuIterator implements Iterator {
String[] foods;
int position = 0;
public MenuIterator(String[] foods) {
this.foods = foods;
}
@Override
public boolean hasNext() {
return position != foods.length;
}
@Override
public Object next() {
final String food = foods[position];
position += 1;
return food;
}
}
(3)定义抽象容器
/**
* 菜单接口 —— 抽象容器
*/
public interface Menu {
void add(String name);
Iterator getIterator();
}
(4)具体容器
/**
* 中国菜单 —— 具体容器
*/
public class ChineseFoodMenu implements Menu {
private String[] foods = new String[4];
private int position = 0;
@Override
public void add(String name) {
foods[position] = name;
position += 1;
}
@Override
public Iterator getIterator() {
return new MenuIterator(this.foods);
}
}
(5)测试
public class Main {
public static void main(String[] args) {
final ChineseFoodMenu chineseFoodMenu = new ChineseFoodMenu();
chineseFoodMenu.add("宫保鸡丁");
chineseFoodMenu.add("孜然羊肉");
chineseFoodMenu.add("水煮鱼");
chineseFoodMenu.add("北京烤鸭");
Iterator iterator = chineseFoodMenu.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}