迭代器模式

摘要

  本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章