迭代器模式模式
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了迭代器模式的原理及应用。本文可帮助读者快速掌握迭代器模式,以便工作学习中使用迭代器模式。
一、迭代器模式
在List、Map、Set数据结构中出现的迭代器我们非常熟悉,他们是为了方便一个集合的遍历。在编程中,一个类会出现多个实例,这样一个实例集在遍历时也需要一个迭代器,同时,也需要一个管理该集合的类,方便增、删、查操作。而这个管理集合的类就像List、Map、Set。
二、迭代器模式的实现
2.1 场景设计
KFC有多种食品,8元的小份薯条、10元的中份薯条、12元的大份薯条、10元的小份汉堡、12元的中份汉堡、14元的大份汉堡。KFC需要对这些食品遍历,并可以增加食品和删除食品。
2.2 代码实现
2.2.1 Food 食品抽象类
package ft.patterns.iterator;
public abstract class Food {
private String name;
private int price;
public Food(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
2.2.2 Chips 薯条具体类
package ft.patterns.iterator;
public class Chips extends Food{
public Chips(String name, int price) {
super(name, price);
}
}
2.2.3 Hamburger 汉堡具体类
package ft.patterns.iterator;
public class Hamburger extends Food{
public Hamburger(String name, int price) {
super(name, price);
}
}
2.2.4 Store 抽象管理角色类
package ft.patterns.iterator;
import java.util.ArrayList;
import java.util.List;
public abstract class Store {
private List<Food> foodList;
Store(){
foodList = new ArrayList<Food>();
}
public void addFood(Food food) {
foodList.add(food);
}
public void removeFood(Food food) {
foodList.remove(food);
}
public FoodIterator getIterator() {
return new FoodIterator(this);
}
public List<Food> getFoodList() {
return foodList;
}
public void setFoodList(List<Food> foodList) {
this.foodList = foodList;
}
}
2.2.5 KFC 具体管理类
package ft.patterns.iterator;
//该具体类不需要实现,只要有接口即可
//或者对具体管理类进行定制化更改
public class KFC extends Store{
}
2.2.6 FoodIterator 食物迭代器
package ft.patterns.iterator;
import java.util.List;
public class FoodIterator {
private List<Food> foodList;
private int position;
FoodIterator(Store store){
foodList = store.getFoodList();
this.position = 0;
}
public boolean hasNext() {
return position < foodList.size();
}
public Food nextFood() {
Food food = foodList.get(position);
position++;
if(food != null)
return food;
return null;
}
}
2.2.7 Main 测试类
package ft.patterns.iterator;
public class Main {
public static void main(String[] args) {
Food hamburger1 = new Hamburger("hamburger1", 10);
Food hamburger2 = new Hamburger("hamburger2", 12);
Food hamburger3 = new Hamburger("hamburger3", 14);
Food chips1 = new Chips("Chips1", 8);
Food chips2 = new Chips("Chips2", 10);
Food chips3 = new Chips("Chips3", 12);
Store kfc = new KFC();
kfc.addFood(hamburger1);
kfc.addFood(hamburger2);
kfc.addFood(hamburger3);
kfc.addFood(chips1);
kfc.addFood(chips2);
kfc.addFood(chips3);
FoodIterator iterator = kfc.getIterator();
while(iterator.hasNext()) {
System.out.println(iterator.nextFood().getName());
}
}
}
2.2.8 测试结果
hamburger2
hamburger3
Chips1
Chips2
Chips3