behavior:迭代器模式

2019-01-22  本文已影响6人  柳源居士

迭代器模式是一个行为型的模式,它用于在不必了解集合内部构成的情况下,遍历集合内部元素。
实现思路:

  1. 实现统一的接口,来约束行为。
  2. 创建需要遍历的集合的迭代器,来实现这个统一接口,并实现迭代方法。迭代方法根据这个集合的特点来完成,迭代器需要获取来自集合传入的数据。
  3. 在集合内部创建迭代器,并把自己需要迭代的数据结构传入迭代器里。
  4. 通过使用集合类来获取迭代器,并迭代自身数据结构。

实现:

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();
    }
}

关键点:
为每个需要迭代的类创建一个迭代器,通过迭代器来使用该类集合的数据。

上一篇 下一篇

猜你喜欢

热点阅读