正文
一、定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
要点:
- 迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象。这样简化了聚合的接口和实现,也让责任各得其所。
二、实现步骤
1、创建迭代器接口
/**
* 迭代器接口
*/
public interface Iterator {
/**
* 是否有下一个元素
*/
public boolean hasNext();
/**
* 获取下一个元素
*/
public Object next();
}
2、创建具体迭代器,并实现迭代器接口
具体迭代器负责遍历元素,以及管理目前遍历的位置。
/**
* 具体迭代器
*/
public class ConcreteIterator implements Iterator {
/**
* 要遍历的集合(数组)
*/
public String[] items;
/**
* 当前遍历位置
*/
int position = 0;
public ConcreteIterator(String[] items) {
this.items = items;
}
@Override
public boolean hasNext() {
if (position < items.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (!this.hasNext()) {
return null;
}
String item = items[position];
position = position + 1;
return item;
}
}
3、创建聚合接口,并定义返回迭代器的方法
/**
* 聚合接口
*/
public interface Aggregate {
/**
* 创建迭代器
*/
public Iterator createIterator();
}
4、创建具体聚合,并实现返回迭代器的方法
具体聚合里面持有集合。这里的集合指的是一群对象,其存储方式可以是列表、数组、散列表等。
/**
* 具体聚合
*/
public class ConcreteAggregate implements Aggregate {
/**
* 持有集合(比如列表、数组、散列表等)
*/
public String[] items = new String[] {"item1", "item2", "item3"};
@Override
public Iterator createIterator() {
return new ConcreteIterator(items);
}
}
5、使用迭代器进行遍历
public class Test {
public static void main(String[] args) {
// 聚合对象
Aggregate aggregate = new ConcreteAggregate();
// 迭代器
Iterator iterator = aggregate.createIterator();
// 遍历
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
三、举个栗子
1、背景
对象村餐厅和对象村煎饼屋合并了,现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐和好吃的餐厅午餐了。
假设你被他们合组的新公司雇佣,打算创建一个 Java 版本的女招待。这个 Java 版本的女招待规格是:能应对顾客的需要打印定制的菜单,而无需询问厨师。
现在,有一点小麻烦:煎饼屋菜单使用 ArrayList 记录菜单项,而餐厅则是使用数组记录菜单项。两者都不愿意改变他们的实现,毕竟有太多代码依赖于它们了。
好消息是,煎饼屋和餐厅都同意实现一个统一的菜单项 MenuItem。
2、实现
将集合的遍历交给迭代器,这样就不用关心菜单是使用 ArrayList 还是数组记录菜单项了。
(1)创建菜单项
/**
* 菜单项
*/
public class MenuItem {
String name;
double price;
public MenuItem(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
(2)创建迭代器接口
/**
* 迭代器接口
*/
public interface Iterator {
/**
* 是否有下一个元素
*/
public boolean hasNext();
/**
* 获取下一个元素
*/
public Object next();
}
(3)创建具体的菜单迭代器
/**
* 煎饼屋菜单迭代器
*/
public class PancakeHouseMenuIterator implements Iterator {
/**
* 列表形式的菜单项
*/
public ArrayList<MenuItem> menuItems;
int position = 0;
public PancakeHouseMenuIterator(ArrayList<MenuItem> items) {
this.menuItems = items;
}
@Override
public boolean hasNext() {
if (position < menuItems.size()) {
return true;
}
return false;
}
@Override
public Object next() {
if (!this.hasNext()) {
return null;
}
MenuItem item = menuItems.get(position);
position = position + 1;
return item;
}
}
/**
* 餐厅菜单迭代器
*/
public class DinerMenuIterator implements Iterator {
/**
* 数组形式的菜单项
*/
public MenuItem[] menuItems;
int position = 0;
public DinerMenuIterator(MenuItem[] items) {
this.menuItems = items;
}
@Override
public boolean hasNext() {
if (position < menuItems.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (!this.hasNext()) {
return null;
}
MenuItem item = menuItems[position];
position = position + 1;
return item;
}
}
(4)创建菜单接口
/**
* 菜单接口
*/
public interface Menu {
/**
* 创建迭代器
*/
public Iterator createIterator();
}
(5)创建具体的菜单
/**
* 煎饼屋菜单
*/
public class PancakeHouseMenu implements Menu {
public ArrayList<MenuItem> menuItems;
public PancakeHouseMenu() {
menuItems = new ArrayList<MenuItem>();
menuItems.add(new MenuItem("Regular Pancake Breakfast", 2.99));
menuItems.add(new MenuItem("Blueberry Pancakes", 3.49));
menuItems.add(new MenuItem("Waffles", 3.59));
}
@Override
public Iterator createIterator() {
return new PancakeHouseMenuIterator(menuItems);
}
}
/**
* 餐厅菜单
*/
public class DinerMenu implements Menu {
public MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[3];
menuItems[0] = new MenuItem("BLT", 2.99);
menuItems[1] = new MenuItem("Soup of the day", 3.29);
menuItems[2] = new MenuItem("Hotdog", 3.05);
}
@Override
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
}
(6)创建女招待
/**
* 女招待
*/
public class Waitress {
Menu pancakeHouseMenu;
Menu dinerMenu;
public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
public void printMenu() {
// 获取菜单迭代器
Iterator pancakeIterator = pancakeHouseMenu.createIterator();
Iterator dinerIterator = dinerMenu.createIterator();
// 使用迭代器打印菜单
System.out.println("----MENU----\n");
System.out.println("BREAKFASE:");
printMenu(pancakeIterator);
System.out.println("\nLUNCH:");
printMenu(dinerIterator);
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.println(menuItem.getName() + ", " + menuItem.getPrice());
}
}
}
(7)使用女招待打印菜单
public class Test {
public static void main(String[] args) {
// 菜单
Menu pancakeHouseMenu = new PancakeHouseMenu();
Menu dinerMenu = new DinerMenu();
// 女招待
Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);
// 打印菜单
waitress.printMenu();
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于