迭代器模式
在面向对象编程里,迭代器模式是一种设计模式,是一种最简单也最常见的设计模式。它可以让用户透过特定的接口顺序访问容器中的每一个元素而不需要了解底层的实现。
此外,也可以实现特定目的版本的迭代器。
小洪的故事
出场人物:小洪、大智
又到了日常晚饭时间,小洪在第二饭堂里溜达来溜达去,正想着吃什么。突然听到背后有人叫他的名字,他一回头,原来是大智。
”看你在这溜达这么久,准备吃点什么呀!“大智过来问。
“不知道呢!“有选择困难症的小洪在吃什么晚饭的时候也会犹豫。
“看你犹豫不决,肯定是发现了菜单的规律吧。”大智神秘地说。
“啊?什么规律啊?”小洪疑惑不解。
“这就是我们前不久学习的设计模式:迭代器模式啊!“
初识迭代器
“比如我们看一下这家晚餐店的菜单,还有这家汉堡店的菜单。”大智指着那两家店说,“如何打印这两份菜单呢?肯定要先编写一个菜单类。这个类中有名称和价格两个属性。”
public class MenuItem {
String name;
int cost;
public MenuItem(String name, int cost) {
this.name = name;
this.cost = cost;
}
@Override
public String toString() {
return "名称:" + name + "====>" +
", 花费:" + cost + "元";
}
}
“但是如果我们想要打印出菜单的每一个样式,提供给用户观看,该怎么办呢?”
“这不简单,for循环一遍过就好了。”小洪不以为然。
“但如果我们使用for循环的话,用户就必须要了解每个菜的具体实现了。我们平时只需要看菜名和价格就好了呀!”
“对哦,那怎么办呢?”小洪恍然大悟。
“这时候我们就需要迭代器帮助我们去遍历了。”大智说。
定义好迭代器的接口
public interface Iterator {
void next();
boolean hashNext();
}
迭代器具体实现
public class IteratorShop implements Iterator {
ArrayList<MenuItem> menuItems;
int number = 0;
public IteratorShop2(ArrayList<MenuItem> menuItems) {
this.menuItems = menuItems;
}
@Override
public void next() {
MenuItem menuItem = menuItems.get(number);
System.out.println(menuItem);
number++;
}
@Override
public boolean hashNext() {
if(number >= menuItems.size()){
return false;
}
return true;
}
}
汉堡店菜单的实现
public class DinnerShop2 {
ArrayList<MenuItem> menuItems;
public DinnerShop2(){
menuItems = new ArrayList<>();
menuItems.add(new MenuItem("汉堡包", 7));
menuItems.add(new MenuItem("薯条", 5));
menuItems.add(new MenuItem("炸鸡翅", 10));
menuItems.add(new MenuItem("童子鸡", 20));
}
public Iterator createIterator(){
return new IteratorShop(menuItems);
}
}
晚餐店菜单的实现
public class DinnerShop {
ArrayList<MenuItem> menuItems;
public DinnerShop1(){
menuItems = new ArrayList<>();
menuItems.add(new MenuItem("小龙虾", 30));
menuItems.add(new MenuItem("黄焖鸡米饭", 20));
menuItems.add(new MenuItem("鸡扒饭", 10));
menuItems.add(new MenuItem("猪脚饭", 10));
}
public Iterator createIterator(){
return new IteratorShop2(menuItems);
}
}
“本来我们需要一一遍历,现在我们在每个饭店中都加入了返回对应迭代器的方法,而每个迭代器都实现了对应饭店菜单的遍历。这样,用户只要调用晚餐店的方法就可以从头到尾进行遍历,而不用去了解菜单的底层实现了。”
客户端进行调用
public class People {
public static void main(String[] args) {
System.out.println("========第一个档口========");
DinnerShop1 dinnerShop1 = new DinnerShop1();
Iterator iterator = dinnerShop1.createIterator();
while(iterator.hashNext()){
iterator.next();
}
System.out.println("========第二个档口========");
DinnerShop2 dinnerShop2 = new DinnerShop2();
Iterator iterator2 = dinnerShop2.createIterator();
while(iterator2.hashNext()){
iterator2.next();
}
}
}
运行结果
========第一个档口========
名称:小龙虾====>, 花费:30元
名称:黄焖鸡米饭====>, 花费:20元
名称:鸡扒饭====>, 花费:10元
名称:猪脚饭====>, 花费:10元
========第二个档口========
名称:汉堡包====>, 花费:7元
名称:薯条====>, 花费:5元
名称:炸鸡翅====>, 花费:10元
名称:童子鸡====>, 花费:20元
“怎么样,忽然发现一个小小的菜单也有大学问了吧。”大智拍拍小洪的肩膀。
“你这知识实在太下饭了,听得我都饿了,我决定叫一只鸡犒劳一下自己。”说着便往麦乐斯的窗口走去,小洪的注意力还是无法集中三秒。