迭代器模式模式
摘要
本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的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