迭代器模式

摘要

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

三、迭代器模式的UML圖

在這裏插入圖片描述

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 1824
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章