迭代器模式是一个行为型的模式,它用于在不必了解集合内部构成的情况下,遍历集合内部元素。
实现思路:
- 实现统一的接口,来约束行为。
- 创建需要遍历的集合的迭代器,来实现这个统一接口,并实现迭代方法。迭代方法根据这个集合的特点来完成,迭代器需要获取来自集合传入的数据。
- 在集合内部创建迭代器,并把自己需要迭代的数据结构传入迭代器里。
- 通过使用集合类来获取迭代器,并迭代自身数据结构。
实现:
package Iterator;
public interface Iterator {
boolean hasNext();
Object next();
}
package Iterator;
public interface Menu{
Iterator createIterator();
}
package Iterator;
import java.util.ArrayList;
import java.util.List;
public class BreakfastMenu implements Menu {
private List<MenuItem> menuItems;
public BreakfastMenu() {
menuItems =new ArrayList<MenuItem>();
addMenuItem("油条","油炸面食",true,2.00);
addMenuItem("豆浆","豆制品",true,2.00);
addMenuItem("胡辣汤","热辣的汤",false,5.00);
addMenuItem("素煎包","带素馅油煎面食",false,0.25);
}
public Iterator createIterator(){
return new BreakfastMenuIterator(menuItems);
}
public void addMenuItem(String name,String description,boolean isVegetarian,double price){
MenuItem item=new MenuItem(name,description,isVegetarian,price);
menuItems.add(item);
}
}
package Iterator;
import java.util.List;
public class BreakfastMenuIterator implements Iterator{
private List<MenuItem> menuItems;
private int position=0;
public BreakfastMenuIterator(List<MenuItem> menuItems) {
this.menuItems=menuItems;
}
@Override
public boolean hasNext() {
if(position>=menuItems.size()){
return false;
}
return true;
}
@Override
public Object next() {
MenuItem item=menuItems.get(position);
position+=1;
return item;
}
}
package Iterator;
import java.awt.*;
public class LaunchMenu implements Menu{
private static final int MAX_SIZE=6;
int numberOfItems=0;
private MenuItem[] menuItems;
public LaunchMenu() {
menuItems=new MenuItem[MAX_SIZE];
addItem("羊肉烩面","汤面",false,12.00);
addItem("米饭","大米食品",true,2.00);
addItem("牛肉面","汤面",false,12.00);
addItem("三鲜水饺","带素馅面食",false,15);
}
public void addItem(String name,String description,boolean isVegetarian, double price){
MenuItem item=new MenuItem(name,description,isVegetarian,price);
if(numberOfItems>=MAX_SIZE){
}else {
menuItems[numberOfItems]=item;
numberOfItems+=1;
}
}
public Iterator createIterator(){
return new LaunchMenuIterator(menuItems);
}
}
package Iterator;
public class LaunchMenuIterator implements Iterator{
private MenuItem[] menuItems;
int position=0;
public LaunchMenuIterator(MenuItem[] menuItems) {
this.menuItems=menuItems;
}
@Override
public boolean hasNext() {
if(position>=menuItems.length||menuItems[position]==null){
return false;
}
return true;
}
@Override
public Object next() {
MenuItem item=menuItems[position];
position+=1;
return item;
}
}
package Iterator;
public class MenuItem {
private String description;
private String name;
private Boolean isVegetarian;
private double price;
public MenuItem(String name,String description, Boolean isVegetarian, double price) {
this.description = description;
this.name = name;
this.isVegetarian = isVegetarian;
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getVegetarian() {
return isVegetarian;
}
public void setVegetarian(Boolean vegetarian) {
isVegetarian = vegetarian;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
package Iterator;
public class Waitress {
Menu breakfastMenu;
Menu launchMenu;
public Waitress(Menu breakfastMenu,Menu launchMenu) {
this.breakfastMenu=breakfastMenu;
this.launchMenu=launchMenu;
}
public void printMenu(){
Iterator iterator=breakfastMenu.createIterator();
printMenu(iterator);
Iterator iteratorLanch=launchMenu.createIterator();
printMenu(iteratorLanch);
}
public void printMenu(Iterator iterator){
while (iterator.hasNext()){
MenuItem item=(MenuItem)iterator.next();
System.out.println("------------------------");
System.out.println("Name:"+item.getName());
System.out.println("Description:"+item.getDescription());
System.out.println("Vagetarian:"+item.getVegetarian());
System.out.println("Price:"+item.getPrice());
}
}
}
import Iterator.BreakfastMenu;
import Iterator.LaunchMenu;
import Iterator.Waitress;
public class Main {
public static void main(String[] args) {
BreakfastMenu breakfastMenu=new BreakfastMenu();
LaunchMenu launchMenu=new LaunchMenu();
Waitress waitress=new Waitress(breakfastMenu,launchMenu);
waitress.printMenu();
}
}
关键点:
为每个需要迭代的类创建一个迭代器,通过迭代器来使用该类集合的数据。
网友评论